如何在Swift中删除视图的所有子视图?

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)

  • 警告,"调用'map'的结果是未使用的`,不是错误.大多数语言中的`Array.map`将返回修改后的数组.不返回数组的等效方法是`view.subviews.forEach`. (8认同)

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.

  • 仅供参考:subviews现在是swift中的只读属性. (4认同)
  • @datayeah他们不是,但是`NSView`(OS X)和`UIView`(iOS)之间存在很大差异. (2认同)
  • @AmrAngry 再次重申,这始终是一个 Mac OS 问题,对于 `NSView`,而不是 iOS 和 `UIView`。只有人们不在乎阅读问题和标签,因此它充满了 iOS 答案。 (2认同)

Mat*_*ttL 9

试试这个:

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)


Yan*_*eph 9

删除所有子视图的扩展名,它会被快速删除.

import Foundation
import UIKit

extension UIView {
    /// Remove allSubView in view
    func removeAllSubViews() {
        self.subviews.forEach({ $0.removeFromSuperview() })
    }

}
Run Code Online (Sandbox Code Playgroud)


nah*_*g89 9

斯威夫特 5

我创建了 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)


aza*_*arp 6

试试这个:

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)


hat*_*yte 5

在xcodebeta6中,这就解决了.

    var subViews = self.parentView.subviews
    for subview in subViews as [UIView]   {
        subview.removeFromSuperview()
    }
Run Code Online (Sandbox Code Playgroud)


upl*_*com 5

斯威夫特 3

如果向视图添加标签,则可以删除特定视图。

for v in (view?.subviews)!
{
    if v.tag == 321
    {
         v.removeFromSuperview()
    }
 }
Run Code Online (Sandbox Code Playgroud)