从视图层次中删除子视图并将其删除的正确方法是什么?

我有一个家长UIView与一些子视图。 定期我需要删除一个子视图,并从系统中完全删除它。 什么是正确的方法来做到这一点? 我试过这个:

UIView *v = [self.containerView viewWithTag:[n integerValue]]; [v removeFromSuperview]; 

并得到了一个奇怪的结果。 以前现在的UIView消失了。 这是怎么回事?

尝试这个:

 UIView *v = [self.containerView viewWithTag:[n integerValue]]; v.hidden = YES; [self.containerView bringSubviewToFront:v]; [v removeFromSuperview]; 

另一件我刚刚从UIView类文档中注意到的 – 请参阅最后一句:

removeFromSuperview将接收者从其超级视图及其窗口中取消链接,并将其从响应者链中移除。

  • (空隙)removeFromSuperview

讨论如果接收者的超视图不是零,这个方法释放接收者。 如果您打算重用该视图,请务必在调用此方法之前保留该视图,并确保在完成视图或将其添加到另一个视图层次结构后将其释放。

显示时切勿调用此方法。

更新:现在是2014年,删除一个子视图没有隐藏它工作得很好。 原始的海报代码应该按原样运行:

 UIView *v = [self.containerView viewWithTag:[n integerValue]]; [v removeFromSuperview]; 

这将删除v和它作为子视图附加到它的任何视图,留下容器视图和v的任何兄弟。

从视图中删除所有子视图:

 for(UIView *subview in [view subviews]) { [subview removeFromSuperview]; } 

如果你只想删除一些特定的视图,那么:

 for(UIView *subview in [view subviews]) { if([subview isKindOfClass:[UIButton class]]) { [subview removeFromSuperview]; } else { // Do nothing - not a UIButton or subclass instance } } 

您也可以通过标签值删除子视图:

 for(UIView *subview in [view subviews]) { if(subview.tag==/*your subview tag value here*/) { [subview removeFromSuperview]; } else { // Do nothing - not a UIButton or subclass instance } } 

Swift 3.0:

 let viewToRemove = mySuperView.viewWithTag(myTag) viewToRemove?.removeFromSuperview() 

这是正确的总体思路。 那些消失的其他UIViews,他们与这个UIView的关系是什么? 他们是否对这个观点进行了分析? 它们是否在你正在移除的视图的dealloc方法中被释放?

你确定你的标签是独一无二的吗?

Sujal

它们是从显示屏上消失还是从显示屏视图层次结构中消失? debugging器显示你什么?

是否有可能cell.contentView有你想要删除的子视图相同的标记? 根据文档 viewWithTag删除:

接收器层次结构中与标签匹配的视图。 接收器包含在search中。

如果是这种情况,那么你可能会无意中从cell中移除cell.contentView。 如果n为0,并且您的单元格的contentview没有为其设置标签,则默认为0,并导致发生这种情况。