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

我该怎么做呢?


当前回答

在Swift中,你可以使用这样的函数式方法:

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

作为比较,命令式方法看起来像这样:

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

这些代码片段只适用于iOS / tvOS,但在macOS上略有不同。

其他回答

如果你想移除UIView(这里是yourView)上的所有子视图,那么在你的按钮点击处写以下代码:

[[yourView subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];
view.subviews.forEach { $0.removeFromSuperview() }

在objective-C中,创建一个类别方法脱离UIView类。

- (void)removeAllSubviews
{
    for (UIView *subview in self.subviews)
        [subview removeFromSuperview];
}

这只适用于OSX,因为在iOS中保留了数组的副本

在删除所有子视图时,最好从数组的末尾开始删除,并一直删除到数组的开头。这可以通过以下两行代码来实现:

for (int i=mySuperView.subviews.count-1; i>=0; i--)
        [[mySuperView.subviews objectAtIndex:i] removeFromSuperview];

斯威夫特1.2

for var i=mySuperView.subviews.count-1; i>=0; i-- {
    mySuperView.subviews[i].removeFromSuperview();
}

或者(效率较低,但可读性更好)

for subview in mySuperView.subviews.reverse() {
    subview.removeFromSuperview()
}

NOTE

你不应该按正常顺序删除子视图,因为如果在removeFromSuperview消息发送给数组的所有对象之前删除UIView实例可能会导致崩溃。(显然,删除最后一个元素不会导致崩溃)

因此,代码

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

不应使用。

引用自苹果关于makeObjectsPerformSelector的文档:

向数组中的每个对象发送给定对象标识的消息 选择器,从第一个对象开始,一直到 数组到最后一个对象。

(这是错误的方向)

试试swift 2.0

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