如何删除所有子视图?

331

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

我该如何做?

15个回答

1
如果您正在使用Swift,那么它就很简单:

subviews.map { $0.removeFromSuperview }

这种方法在哲学上类似于makeObjectsPerformSelector,但具有稍微更多的类型安全性。

1
这在语义上是不正确的,map 不应该产生副作用。此外,通过 forEach 可以实现相同的结果。 - Cristik

1
为了删除所有子视图,语法如下:

- (void)makeObjectsPerformSelector:(SEL)aSelector;

使用方法:

[self.View.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

这个方法在NSArray.h文件中出现,使用NSArray(NSExtendedArray)接口。

0
在 monotouch / xamarin.ios 中,这对我起作用:
SomeParentUiView.Subviews.All(x => x.RemoveFromSuperview);

0

对于使用自动布局的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.constraints],因为在XCode中设置了一些约束条件,这些条件会被清除。


-10

为了从父视图中移除所有子视图:

NSArray *oSubView = [self subviews];
for(int iCount = 0; iCount < [oSubView count]; iCount++)
{
    id object = [oSubView objectAtIndex:iCount];
    [object removeFromSuperview];
    iCount--;
}

@Pravin,这里有几个主要的错误。首先,你需要将“object”定义为UIView*,否则使用[object removeFromSuperview]会导致编译器错误。其次,你的for循环已经在递减iCount,所以你的iCount--行会多跳过一个。最后,上面有两种可行且正确的方法,而你的方法既不更优雅也不更快。 - amergin
5
每次迭代中你都执行 iCount++iCount-- 操作,但是索引值保持不变,如果 [oSubView count]>0,那么程序将会进入无限循环。这明显是有缺陷的,并且 不能使用 - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接