如何在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()}
我认为这种方法比使用map或forEach的“单行”更具可读性。 由于逻辑更抽象,短暂的foreach和map可能很难理解。
对于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() } }