e.J*_*mes 567
编辑:感谢cocoafan:这种情况因为事情NSView
和UIView
处理事情而变得混乱.对于NSView
(仅限桌面Mac开发),您只需使用以下内容:
[someNSView setSubviews:[NSArray array]];
Run Code Online (Sandbox Code Playgroud)
对于UIView
(仅限iOS开发),您可以安全使用,makeObjectsPerformSelector:
因为该subviews
属性将返回子视图数组的副本:
[[someUIView subviews]
makeObjectsPerformSelector:@selector(removeFromSuperview)];
Run Code Online (Sandbox Code Playgroud)
感谢Tommy指出在枚举时makeObjectsPerformSelector:
似乎修改了subviews
数组(它的目的是为了NSView
,但不是为了UIView
).
有关更多详细信息,请参阅此SO问题.
注意:使用这两种方法中的任何一种都将删除主视图包含的每个视图并释放它们,如果它们未在其他地方保留的话.从Apple关于removeFromSuperview的文档:
如果接收者的superview不是nil,则此方法释放接收者.如果您计划重用该视图,请确保在调用此方法之前保留该视图,并确保在完成该视图或将其添加到另一个视图层次结构后适当地释放它.
Mat*_*gan 171
从根控制器获取所有子视图,并发送每个removeFromSuperview:
NSArray *viewsToRemove = [self.view subviews];
for (UIView *v in viewsToRemove) {
[v removeFromSuperview];
}
Run Code Online (Sandbox Code Playgroud)
Jee*_*hut 110
在Swift中,您可以使用这样的功能方法:
view.subviews.forEach { $0.removeFromSuperview() }
Run Code Online (Sandbox Code Playgroud)
作为比较,命令式方法如下所示:
for subview in view.subviews {
subview.removeFromSuperview()
}
Run Code Online (Sandbox Code Playgroud)
这些代码片段仅适用于iOS/tvOS,但macOS上的情况略有不同.
小智 13
如果要删除UIView(此处yourView
)上的所有子视图,请在按下按钮时编写此代码:
[[yourView subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];
Run Code Online (Sandbox Code Playgroud)
删除所有子视图时,最好在数组末尾开始删除并继续删除,直到到达开头.这可以通过以下两行代码完成:
for (int i=mySuperView.subviews.count-1; i>=0; i--)
[[mySuperView.subviews objectAtIndex:i] removeFromSuperview];
Run Code Online (Sandbox Code Playgroud)
SWIFT 1.2
for var i=mySuperView.subviews.count-1; i>=0; i-- {
mySuperView.subviews[i].removeFromSuperview();
}
Run Code Online (Sandbox Code Playgroud)
或(效率低下,但更具可读性)
for subview in mySuperView.subviews.reverse() {
subview.removeFromSuperview()
}
Run Code Online (Sandbox Code Playgroud)
注意
您应该不删除子视图是正常的顺序,因为这可能会导致崩溃,如果一个UIView实例被删除之前,removeFromSuperview
消息已经被发送到阵列的所有对象.(显然,删除最后一个元素不会导致崩溃)
因此,代码
[[someUIView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
Run Code Online (Sandbox Code Playgroud)
应该不被使用.
从Apple文档中引用makeObjectsPerformSelector:
向数组中的每个对象发送由给定选择器标识的消息,从第一个对象开始并继续通过数组到最后一个对象.
(为此目的,这将是错误的方向)
试试这种方式 swift 2.0
view.subviews.forEach { $0.removeFromSuperview() }
Run Code Online (Sandbox Code Playgroud)
小智 5
view.subviews.forEach { $0.removeFromSuperview() }
Run Code Online (Sandbox Code Playgroud)