当我的应用程序回到它的根视图控制器,在viewDidAppear:方法中,我需要删除所有子视图。
我该怎么做呢?
当我的应用程序回到它的根视图控制器,在viewDidAppear:方法中,我需要删除所有子视图。
我该怎么做呢?
当前回答
从你的根控制器获取所有的子视图,并给每个子视图发送一个removeFromSuperview:
NSArray *viewsToRemove = [self.view subviews];
for (UIView *v in viewsToRemove) {
[v removeFromSuperview];
}
其他回答
对于使用自动布局的ios6,我不得不添加一些代码来消除限制。
NSMutableArray * constraints_to_remove = [ @[] mutableCopy] ;
for( NSLayoutConstraint * constraint in tagview.constraints) {
if( [tagview.subviews containsObject:constraint.firstItem] ||
[tagview.subviews containsObject:constraint.secondItem] ) {
[constraints_to_remove addObject:constraint];
}
}
[tagview removeConstraints:constraints_to_remove];
[ [tagview subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
我相信还有更简洁的方法,但这对我来说很管用。在我的情况下,我不能使用直接[tagview removeConstraints:tagview。因为在XCode中设置了一些被清除的约束。
如果你正在使用Swift,它就像:
subviews.map { $0.removeFromSuperview }
它在理念上与makeObjectsPerformSelector方法相似,但是具有更多的类型安全性。
这只适用于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的文档:
向数组中的每个对象发送给定对象标识的消息 选择器,从第一个对象开始,一直到 数组到最后一个对象。
(这是错误的方向)
在monotouch / xamarin。这对我来说很管用:
SomeParentUiView.Subviews.All(x => x.RemoveFromSuperview);
为了从父视图中移除所有子视图:
NSArray *oSubView = [self subviews];
for(int iCount = 0; iCount < [oSubView count]; iCount++)
{
id object = [oSubView objectAtIndex:iCount];
[object removeFromSuperview];
iCount--;
}