如何在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) } 

我错过了什么?

UPDATE

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

所以,当点击button“打开”一个特定的页面时,我需要删除allsubviews并添加新的。

更新2 – 一个工作解决scheme(OS X)

我猜苹果修复了它。

现在比以往任何时候都更容易,只需要打电话:

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

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

到目前为止,在Swift for iOS中最好的方法是:

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

^^这些function很有趣!

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

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

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

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

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

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

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

这应该是最简单的解决scheme

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

(请参阅移除其他方法的所有子视图?

我不知道你是否设法解决这个问题,但是我最近经历了类似的问题,For循环每次都留下一个视图。 我发现这是因为当调用removeFromSuperview()时,self.subviews发生了变化(也许)。

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

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

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

编辑:在你的情况,我想你会使用:

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

尝试这个:

 for view in container_view.subviews { view.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() 

在xcodebeta6这个解决了。

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

删除所有子视图的扩展名,它很快被删除。

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

我写了这个扩展名:

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

所以你可以在UIViewController中使用self.view.lf_removeAllSubviews。 稍后我将在swift版本的https://github.com/superarts/LFramework中join这个版本,当时我有更多的swift经验(迄今为止的1天exp,是的,因为我放弃了下划线的API)。;

你的语法稍微偏离。 确保你明确地施放。

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

试试这个,我testing了这个:

 let theSubviews = container_view.subviews for view: AnyObject in theSubviews { view.removeFromSuperview() } 

你必须尝试这个

 func clearAllScrollSubView () { let theSubviews = itemsScrollView.subviews for (var view) in theSubviews { if view is UIView { view.removeFromSuperview() } } } 

Swift 3

如果你添加一个标签到你的视图,你可以删除一个特定的视图。

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

只删除特定类的子视图 – 这是Xcode6.1.1中唯一适用于我的Swift代码。 假设您想要删除的唯一子视图的types为UIButton

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

一内胆:

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

我认为这种方法比使用mapforEach的“单行”更具可读性。 由于逻辑更抽象,短暂的foreachmap可能很难理解。

对于Swift 3

我做了以下,因为只是从超级视图删除不擦除arraysbutton。

  for k in 0..<buttons.count { buttons[k].removeFromSuperview() } buttons.removeAll() 

(对不起,没有声望来回答Bseaborn)这在快速的4:

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

你尝试过类似的吗?

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