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

我该怎么做呢?


当前回答

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

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

其他回答

在monotouch / xamarin。这对我来说很管用:

SomeParentUiView.Subviews.All(x => x.RemoveFromSuperview);

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

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

编辑:感谢cocoafan:这种情况是混淆的事实,NSView和UIView处理事情的方式不同。对于NSView(桌面Mac开发),你可以简单地使用以下:

[someNSView setSubviews:[NSArray array]];

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

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

感谢Tommy指出,makeObjectsPerformSelector:似乎是修改子视图数组,而它被枚举(这是NSView,但不是UIView)。

请参阅这个SO问题了解更多细节。

注意:使用这两种方法中的任何一种都会删除你的主视图包含的每个视图,如果它们没有保留在其他地方,则会释放它们。来自苹果关于removeFromSuperview的文档:

如果接收器的父视图不是nil,这个方法会释放接收器。如果您计划重用视图,请确保在调用此方法之前保留它,并确保在您完成它或将它添加到另一个视图层次结构之后适当地释放它。

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

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

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

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

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