Macos 如何在Swift中删除视图的所有子视图?
我正在寻找一种简单的方法,从superview中一次删除所有子视图,而不是逐个删除它们Macos 如何在Swift中删除视图的所有子视图?,macos,view,swift,Macos,View,Swift,我正在寻找一种简单的方法,从superview中一次删除所有子视图,而不是逐个删除它们 //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) } 我错过了什么 更新 我的应用程序有一
//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\u视图
,以便提供某种导航
因此,当单击按钮“打开”特定页面时,我需要删除所有子视图并添加新的子视图
更新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()
}
让子视图:Array=container\u view.subview作为数组
用于在子视图中查看{
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()
}
这样称呼它:
parentView.removeAllSubViews()
这应该是最简单的解决方案
let container_view: NSView = ...
container_view.subviews = []
(其他方法请参见)
注意这是一个MacOS问题,此答案仅适用于MacOS。它在iOS上不起作用。编辑:(谢谢Jeremiah/Rollo) 到目前为止,在Swift for iOS中实现这一点的最佳方法是:
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()时self.subview发生了变异(可能) 为了解决这个问题,我做了:
let subViews: Array = self.subviews.copy()
for (var subview: NSView!) in subViews
{
subview.removeFromSuperview()
}
通过执行.copy(),我可以在修改self.subviews数组的同时删除每个子视图。这是因为复制的数组(子视图)包含对对象的所有引用,并且不会发生变化
编辑:在您的情况下,我认为您会使用:
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()
}
}
}
这样您就可以在UIViewController中使用self.view.lf_removeallsubview。当我有更多的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)的所有子视图,我使用:
为了只删除特定类的子视图,这是在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() }
一艘班轮:
Swift 3 如果向视图中添加标记,则可以删除特定视图
for v in (view?.subviews)!
{
if v.tag == 321
{
v.removeFromSuperview()
}
}
斯威夫特3
我这样做是因为仅仅从superview中删除并没有从数组中删除按钮
for k in 0..<buttons.count {
buttons[k].removeFromSuperview()
}
buttons.removeAll()
用于0中的k..用于Swift 4.+
extension UIView {
public func removeAllSubViews() {
self.subviews.forEach({ $0.removeFromSuperview() })
}
我希望您能充分利用此功能。Swift 5
我创建了两种不同的方法来删除子视图。如果我们把它们放在扩展中
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{
///删除所有子视图
func removeAllSubviews(){
subviews.forEach{$0.removeFromSuperview()}
}
///删除具有特定类型的所有子视图
func removeallsubview(类型:T.type){
子视图
.filter{$0.isMember(of:type)}
.forEach{$0.removeFromSuperview()}
}
}
这里有另一种方法,允许您对UIView
实例(或UIView
子类)的任何集合调用该操作。这使得在子视图
之后插入过滤器
等内容变得很容易,因此您可以更具选择性,或者在其他UIView
s集合中调用它
extension Array where Element: UIView {
func removeEachFromSuperview() {
forEach {
$0.removeFromSuperview()
}
}
}
用法示例:
myView.subviews.removeEachFromSuperview()
// or, for example:
myView.subivews.filter { $0 is UIImageView }.removeEachFromSuperview()
myView.removeSubviews()
myView.removeSubviews { $0 is UIImageView }
或者,您也可以使用UIView
扩展来完成相同的任务(尽管这不能在UIView
实例的任意数组上调用):
用法示例:
myView.subviews.removeEachFromSuperview()
// or, for example:
myView.subivews.filter { $0 is UIImageView }.removeEachFromSuperview()
myView.removeSubviews()
myView.removeSubviews { $0 is UIImageView }
两件小事:我正在开发osx,所以它是对的?然后,我得到了“致命错误:数组索引超出范围”:/是的,我认为在OSX上是NSView。你从哪里得到致命错误?你确定你的父视图有子元素吗?是的!如果我做一个println(parentView.subview),我会得到1,这很奇怪!通常超出范围意味着您正在访问一个不存在的索引,通常我认为这是由于使用带有索引(如I++)的for循环造成的。@David是的,它会的,我试图使它尽可能接近FoxNos的初始代码。效果很好!ThanksHello,请尝试以下方法,尽管可能有一种更优雅的方法:
let subViewsArray:Array=(parentView.subviews as NSArray)。copy()as Array
这就是iOS。我需要一个用于OS X的解决方案IOS+1的伟大解决方案,它是UI而不是NS。这里我们讨论的是OS X。如果用NS取代UI也能用它工作,那我的错,你是对的:)这绝对是最简单的方法。。。对于不再在子视图数组中的每个视图,都会自动调用removeFromSuperview。@数据是的,它们不是,但是NSView
(OS X)和UIView
(iOS)之间有很大的区别。@Sulthan你说得对。我来这里是为了快速回答UIView的问题,但我没有阅读您的全部代码片段;)Swift 4给出错误:无法分配给属性:“子视图”是仅获取的属性:(@AmrAngry,我再说一遍,这始终是一个Mac OS问题,因为NSView
,而不是iOS和UIView
。只有人们不喜欢阅读问题和标签,因此它充满了iOS的答案。我想指出,@sulthan的答案,尽管被破布掩埋,却是最好的答案:@christorswasey Swift 4给出了一个答案错误:无法分配给属性:“子视图”是仅获取的属性。:(@WilliamT.Mallard)多少次
extension UIView {
func removeSubviews(predicate: ((UIView) -> Bool)? = nil)
subviews.filter(
predicate ?? { _ in true }
).forEach {
$0.removeFromSuperview()
}
}
}
myView.removeSubviews()
myView.removeSubviews { $0 is UIImageView }