如何删除子视图(或视图的所有子视图)

Posted

技术标签:

【中文标题】如何删除子视图(或视图的所有子视图)【英文标题】:How to remove a subview (or all subviews of a view) 【发布时间】:2011-05-01 20:33:39 【问题描述】:

我有一个方法,我在其中分配和初始化一个

UIView (`tabsClippedView = [[[UIView alloc] initWithFrame:tabsClippedFrame] autorelease];`).

这个视图添加了另一个视图

(`tabsView = [[[UIView alloc] initWithFrame:tabsFrame] autorelease];`).     

然后我启动几个按钮

(e.g. `UIButton* btn = [[[UIButton alloc] initWithFrame:frame] autorelease];`)

并将它们添加到视图的子视图中。

现在,我有时需要删除所有按钮并重新分配它们。是删除整个视图的最佳方式还是删除我添加按钮的子视图?

我需要怎么做(没有内存泄漏等)? 会不会很简单

self.tabsView = nil;

是否足以删除视图及其所有子视图(即按钮)?

或者最好也删除超级视图,完全从头开始:

self.tabsClippedView = nil;

【问题讨论】:

我在另一个 *** 问题中找到了答案:***.com/a/2156046/374873 【参考方案1】:

由于您的 UIView 是自动释放的,您只需将其从超级视图中删除即可。有removeFromSuperview 方法。

所以,您只需致电[self.tabsView removeFromSuperview]。只要您的属性声明设置为retain,这就是您所需要的。

【讨论】:

谢谢... 那么 self.tabsView = nil;命令——这会是错误的还是与 removeFromSuperview 不同?感谢您的帮助! self.tabsView = nil 不会将其从 superView 中删除。 他/她所说的 - 您不需要将其设置为 nil,因为只要您正确设置了 @property 声明,这将在您重新分配属性时得到处理.【参考方案2】:

另一种解决方案:不要删除您的 UIButtons,而是重新使用它们。不知道您的确切用例,但您可以将 tags 分配给您的 UIButtons 并使用 [UIView viewWithTag:] 找到它们。

UIButton* btn = [[UIButton alloc] initWithFrame:frame];
btn.tag = 42; // some unique identifier for the button.. dont use 0 (zero)
[tabsView addSubview:btn];
[btn release];

稍后...

UIButton* btn = (UIButton*)[tabsView viewWithTag:42];
if(btn && [btn isKindOfClass:[UIButton class]]) 
    // do some stuff with btn

另外:在我看来,只有在别无选择时才应该使用autorelease。将btn添加为子视图后,在这里很容易释放。

【讨论】:

谢谢,但我需要完全删除一些按钮,所以我想这行不通。不过,感谢您的想法。

以上是关于如何删除子视图(或视图的所有子视图)的主要内容,如果未能解决你的问题,请参考以下文章

删除子视图时如何修复触摸禁用?

如何从表视图中添加/删除子视图

如何在运行时从超级视图中删除视图?

如何从 X 个按钮中删除子视图

调用触摸手势事件时如何检查其父视图或子视图?

删除除命名的所有子视图