删除所有子视图?

当我的应用程序回到其根视图控制器时,在viewDidAppear:方法中,我需要删除所有子视图。

我怎样才能做到这一点?


编辑:感谢cocoafan: NSViewUIView不同的方式处理事实,这种情况被混淆了。 对于NSView (仅适用于桌面Mac开发),您可以简单地使用以下内容:

[someNSView setSubviews:[NSArray array]];

对于UIView (仅适用于iOS开发),您可以安全地使用makeObjectsPerformSelector:因为subviews属性将返回子视图数组的副本:

[[someUIView subviews]
 makeObjectsPerformSelector:@selector(removeFromSuperview)];

感谢Tommy指出makeObjectsPerformSelector:在枚举时修改subviews数组(对于NSView ,而不是UIView )。

有关更多详细信息,请参阅此SO问题。

注意:使用这两种方法中的任何一种都会删除主视图中包含的所有视图,并释放它们(如果它们未保留在别处)。 从Apple的removeFromSuperview文档:

如果接收者的超级视图不为零,则此方法释放接收者。 如果您打算重新使用视图,请务必在调用此方法之前保留它,并确保在完成视图或将视图添加到其他视图层次结构后将其释放。


从您的根控制器获取所有子视图,并发送每个removeFromSuperview:

NSArray *viewsToRemove = [self.view subviews];
for (UIView *v in viewsToRemove) {
    [v removeFromSuperview];
}

Swift中,你可以使用这样的功能性方法

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

作为比较, 必要的方法将如下所示:

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

这些代码片段仅适用于iOS / tvOS,但macOS上的情况有点不同。

链接地址: http://www.djcxy.com/p/74375.html

上一篇: Remove all subviews?

下一篇: how to remove subviews from scrollview?