Alb*_*ini 159 macos view swift
我正在寻找一种简单的方法来立即从超视图中删除所有子视图,而不是逐个删除它们.
//I'm trying something like this, but is not working
let theSubviews : Array = container_view.subviews
for (view : NSView) in theSubviews {
view.removeFromSuperview(container_view)
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
UPDATE
我的应用有一个主要的container_view.我必须添加不同的其他视图作为子视图,container_view以提供一种导航.
因此,当单击按钮以"打开"特定页面时,我需要删除所有子视图并添加新视图.
更新2 - 工作解决方案(OS X)
我猜Apple修了它.
现在比以往任何时候都更容易,只需致电:
for view in containerView.subviews{
view.removeFromSuperview()
}
Run Code Online (Sandbox Code Playgroud)
Bse*_*orn 336
编辑:(感谢Jeremiah/Rollo)
到目前为止,在Swift for iOS中执行此操作的最佳方法是:
view.subviews.forEach({ $0.removeFromSuperview() }) // this gets things done
view.subviews.map({ $0.removeFromSuperview() }) // this returns modified array
Run Code Online (Sandbox Code Playgroud)
^^这些功能很有趣!
let funTimes = ["Awesome","Crazy","WTF"]
extension String {
func readIt() {
print(self)
}
}
funTimes.forEach({ $0.readIt() })
Run Code Online (Sandbox Code Playgroud)
////结束编辑
这样做:
for view in self.view.subviews {
view.removeFromSuperview()
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您正在寻找特定的课程
for view:CustomViewClass! in self.view.subviews {
if view.isKindOfClass(CustomViewClass) {
view.doClassThing()
}
}
Run Code Online (Sandbox Code Playgroud)
ton*_*har 38
对于iOS/Swift,要摆脱我使用的所有子视图:
for v in view.subviews{
v.removeFromSuperview()
}
Run Code Online (Sandbox Code Playgroud)
为了摆脱特定类的所有子视图(如UILabel),我使用:
for v in view.subviews{
if v is UILabel{
v.removeFromSuperview()
}
}
Run Code Online (Sandbox Code Playgroud)
mis*_*may 30
代码可以更简单地编写如下.
view.subviews.forEach { $0.removeFromSuperview() }
Run Code Online (Sandbox Code Playgroud)
Sul*_*han 16
这应该是最简单的解决方案.
let container_view: NSView = ...
container_view.subviews = []
Run Code Online (Sandbox Code Playgroud)
(有关其他方法,请参阅删除所有子视图?)
请注意,这是一个MacOS问题,此答案仅适用于MacOS.它不适用于iOS.
试试这个:
for view in container_view.subviews {
view.removeFromSuperview()
}
Run Code Online (Sandbox Code Playgroud)
小智 9
我不知道你是否设法解决这个问题,但我最近遇到了类似的问题,For循环每次都会留下一个视图.我发现这是因为在调用removeFromSuperview()时self.subviews被突变(可能).
为了解决这个问题我做了:
let subViews: Array = self.subviews.copy()
for (var subview: NSView!) in subViews
{
subview.removeFromSuperview()
}
Run Code Online (Sandbox Code Playgroud)
通过执行.copy(),我可以在改变self.subviews数组时执行每个子视图的删除.这是因为复制的数组(subViews)包含对象的所有引用,并且不会发生变异.
编辑:在你的情况下,我认为你会使用:
let theSubviews: Array = container_view.subviews.copy()
for (var view: NSView!) in theSubviews
{
view.removeFromSuperview()
}
Run Code Online (Sandbox Code Playgroud)
删除所有子视图的扩展名,它会被快速删除.
import Foundation
import UIKit
extension UIView {
/// Remove allSubView in view
func removeAllSubViews() {
self.subviews.forEach({ $0.removeFromSuperview() })
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了 2 种不同的方法来删除子视图。如果我们把它们放进去会更容易使用extension
extension UIView {
/// Remove all subview
func removeAllSubviews() {
subviews.forEach { $0.removeFromSuperview() }
}
/// Remove all subview with specific type
func removeAllSubviews<T: UIView>(type: T.Type) {
subviews
.filter { $0.isMember(of: type) }
.forEach { $0.removeFromSuperview() }
}
}
Run Code Online (Sandbox Code Playgroud)
试试这个:
var subViews = parentView.subviews as Array<UIView>
for someView in subViews
{
someView.removeFromSuperview()
}
Run Code Online (Sandbox Code Playgroud)
更新:如果您有冒险精神,那么您可以在UIView上进行扩展,如下所示:
extension UIView
{
func removeAllSubViews()
{
for subView :AnyObject in self.subviews
{
subView.removeFromSuperview()
}
}
}
Run Code Online (Sandbox Code Playgroud)
并称之为:
parentView.removeAllSubViews()
Run Code Online (Sandbox Code Playgroud)
在xcodebeta6中,这就解决了.
var subViews = self.parentView.subviews
for subview in subViews as [UIView] {
subview.removeFromSuperview()
}
Run Code Online (Sandbox Code Playgroud)
斯威夫特 3
如果向视图添加标签,则可以删除特定视图。
for v in (view?.subviews)!
{
if v.tag == 321
{
v.removeFromSuperview()
}
}
Run Code Online (Sandbox Code Playgroud)