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

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

你有没有试过

for o : AnyObject in self.subviews {
     if let v = o as? NSView {
         v.removeFromSuperview()
     }
}

试试这个:

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

你的语法有点不对。确保显式强制转换。

 let theSubviews : Array<NSView> = container_view.subviews as Array<NSView>
 for view in theSubviews {
     view.removeFromSuperview()
 }

试试这个,我测试过了:

  let theSubviews = container_view.subviews
  for subview in theSubviews {
      subview.removeFromSuperview()
  }

试试这个:

var subViews = parentView.subviews as Array<UIView>

      for someView in subViews
      {
          someView.removeFromSuperview()
      }

更新:如果你喜欢冒险,那么你可以在UIView上做一个扩展,如下所示:

extension UIView
{
    func removeAllSubViews()
    {
       for subView :AnyObject in self.subviews
       {
            subView.removeFromSuperview()
       }
    }

}

像这样叫它:

parentView.removeAllSubViews()

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

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

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


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


编辑:(感谢耶利米/罗洛)

到目前为止,在iOS Swift中做到这一点的最佳方法是:

view.subviews.forEach({ $0.removeFromSuperview() }) // this gets things done
view.subviews.map({ $0.removeFromSuperview() }) // this returns modified array

^^这些功能很有趣!

let funTimes = ["Awesome","Crazy","WTF"]
extension String { 
    func readIt() {
        print(self)
    }
}

funTimes.forEach({ $0.readIt() })

////结束编辑

只要这样做:

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

或者如果你正在寻找一个特定的类

for view:CustomViewClass! in self.view.subviews {
        if view.isKindOfClass(CustomViewClass) {
            view.doClassThing()
        }
    }

我不知道你是否解决了这个问题,但我最近遇到了一个类似的问题,每次For循环都留下一个视图。我发现这是因为自我。当removeFromSuperview()被调用时,subviews(可能)发生了变化。

为了解决这个问题,我做了:

let subViews: Array = self.subviews.copy()
for (var subview: NSView!) in subViews
{
    subview.removeFromSuperview()
}

通过执行.copy(),我可以在改变self的同时删除每个子视图。子视图数组。这是因为复制的数组(子视图)包含对对象的所有引用,并且没有发生变化。

编辑:在你的情况下,我认为你会使用:

let theSubviews: Array = container_view.subviews.copy()
for (var view: NSView!) in theSubviews
{
    view.removeFromSuperview()
}

在xcodebeta6中,这是可行的。

    var subViews = self.parentView.subviews
    for subview in subViews as [UIView]   {
        subview.removeFromSuperview()
    }

我写了这个扩展:

extension UIView {
    func lf_removeAllSubviews() {
        for view in self.subviews {
            view.removeFromSuperview()
        }
    }
}

你可以使用self。view。UIViewController中的lf_removeAllSubviews。稍后我会把它放在我的https://github.com/superarts/LFramework的swift版本中,当我在swift方面有更多的经验时(到目前为止1天的经验,是的,对于API我放弃了下划线)。


你得试试这个

func clearAllScrollSubView ()
{
    let theSubviews = itemsScrollView.subviews

    for (var view) in theSubviews
    {

        if view is UIView
        {
            view.removeFromSuperview()
        }

    }
}

对于iOS/Swift,要摆脱我使用的所有子视图:

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

来摆脱我使用的特定类(如UILabel)的所有子视图:

for v in view.subviews{
   if v is UILabel{
      v.removeFromSuperview()
   }
}

仅删除特定类的子视图-这是我在Xcode6.1.1中唯一工作的Swift代码。 假设你想要删除的子视图类型是UIButton…

for subView in nameofmysuperview.subviews {
    if subView.isKindOfClass(UIButton) {
        subView.removeFromSuperview()
    }
}

扩展删除所有子视图,它是快速删除。

import Foundation
import UIKit

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

}

代码可以写得更简单,如下所示。

view.subviews.forEach { $0.removeFromSuperview() }

一行程序:

while view.subviews.count > 0  { (view.subviews[0] as? NSView)?.removeFromSuperview() } 

斯威夫特3

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

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

Swift 3

我这样做是因为仅仅从superview中删除并没有从数组中删除按钮。

    for k in 0..<buttons.count {

      buttons[k].removeFromSuperview()

    }


    buttons.removeAll()

对于Swift 4.+

extension UIView {
     public func removeAllSubViews() {
          self.subviews.forEach({ $0.removeFromSuperview() })

}

我希望这对你有用。


斯威夫特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() }
    }
}

下面是另一种方法,它允许你对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 }

这是你一直在寻找的一句俏皮话:

view.subviews.filter({$0.tag == 321}).forEach({$0.removeFromSuperview()})

别忘了标记你的视图(someView.)Tag = 321),然后用此代码删除它。