我正在寻找一个简单的方法,从一个父视图中删除所有的子视图,而不是一个接一个地删除它们。

//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)
}

我错过了什么?

更新

我的应用程序有一个主container_view。为了提供某种导航,我必须将不同的其他视图作为子视图添加到container_view中。

所以,当点击按钮“打开”一个特定的页面,我需要删除所有的子视图,并添加一个新的。

更新2 -一个工作解决方案(OS X)

我想苹果已经解决了这个问题。

现在比以往任何时候都简单,只需拨打:

for view in containerView.subviews{
    view.removeFromSuperview()
}

当前回答

下面是另一种方法,它允许你对UIView实例(或UIView子类)的任何集合调用操作。这使得在.subviews后插入filter之类的东西变得很容易,这样你可以更有选择性,或者在其他UIViews集合上调用这个。

extension Array where Element: UIView {
  func removeEachFromSuperview() {
    forEach {
      $0.removeFromSuperview()
    }
  }
}

使用示例:

myView.subviews.removeEachFromSuperview()

// or, for example:

myView.subivews.filter { $0 is UIImageView }.removeEachFromSuperview()

另外,你也可以用UIView扩展完成同样的事情(尽管这不能在一些任意的UIView实例数组上调用):

extension UIView {
    func removeSubviews(predicate: ((UIView) -> Bool)? = nil) 
        subviews.filter(
            predicate ?? { _ in true }
        ).forEach {
            $0.removeFromSuperview()
        }
    }
}

使用示例:

myView.removeSubviews()
myView.removeSubviews { $0 is UIImageView }

其他回答

这应该是最简单的解决方案。

let container_view: NSView = ...
container_view.subviews = []

(参见删除所有子视图?其他方法)


注意,这是一个MacOS问题,这个答案只适用于MacOS。它不能在iOS上运行。

你得试试这个

func clearAllScrollSubView ()
{
    let theSubviews = itemsScrollView.subviews

    for (var view) in theSubviews
    {

        if view is UIView
        {
            view.removeFromSuperview()
        }

    }
}

斯威夫特3

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

for v in (view?.subviews)!
{
    if v.tag == 321
    {
         v.removeFromSuperview()
    }
 }

下面是另一种方法,它允许你对UIView实例(或UIView子类)的任何集合调用操作。这使得在.subviews后插入filter之类的东西变得很容易,这样你可以更有选择性,或者在其他UIViews集合上调用这个。

extension Array where Element: UIView {
  func removeEachFromSuperview() {
    forEach {
      $0.removeFromSuperview()
    }
  }
}

使用示例:

myView.subviews.removeEachFromSuperview()

// or, for example:

myView.subivews.filter { $0 is UIImageView }.removeEachFromSuperview()

另外,你也可以用UIView扩展完成同样的事情(尽管这不能在一些任意的UIView实例数组上调用):

extension UIView {
    func removeSubviews(predicate: ((UIView) -> Bool)? = nil) 
        subviews.filter(
            predicate ?? { _ in true }
        ).forEach {
            $0.removeFromSuperview()
        }
    }
}

使用示例:

myView.removeSubviews()
myView.removeSubviews { $0 is UIImageView }

斯威夫特5

我创建了2个不同的方法来删除子视图。如果我们把它们扩展开来,会更容易使用

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() }
    }
}