什么是去除从视图层次结构中的子视图和核武器攻击它的正确方法?(What is the correct

2019-08-17 06:24发布

我有许多子视图的父UIView的。 定期我需要删除一个子视图,并完全从系统中删除。 什么是这样做的正确方法? 我尝试这样做:

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

[v removeFromSuperview];

并得到了一个奇怪的结果。 先前存在UIView失踪以及为好。 这是怎么回事?

Answer 1:

试试这个:

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和它连接到它的子视图的任何观点,留下containerView和V的兄弟姐妹。



Answer 2:

若要从您的视图中的所有子视图:

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
    }
}


Answer 3:

雨燕3.0:

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


Answer 4:

这是正确的总体思路。 这消失的其他UIViews,什么是他们对这个UIView的关系? 他们是子视图这种观点吗? 他们说的是您要移除视图的dealloc方法dealloc'd?

你确定你的标签是唯一的?



Answer 5:

他们只是从显示消失,或者从显示器视图层次结构中消失? 什么是调试器告诉你?



Answer 6:

难道cell.contentView具有相同的标签,你要删除的子视图? 根据文档 viewWithTag去除:

匹配标签在接收器的层次结构视图。 该接收器包含在搜索中。

如果是这种情况,那么你可能会不经意地从细胞去除cell.contentView。 如果n是零,您单元的内容查看没有标签设置它,它会默认为0,并导致这样的事情发生。



Answer 7:

迅速4:延伸的UIView

extension UIView {
    public func removeAllSubviews() {
        for subview in self.subviews {
            subview.removeFromSuperview()
        }
    }
}

要么

extension UIView {
    public func removeAllSubviews() {
        self.subviews.forEach { $0.removeFromSuperview() }
    }
}


文章来源: What is the correct way to remove a subview from a view hierarchy and nuke it?