从 Superview 中删除子视图
Posted
技术标签:
【中文标题】从 Superview 中删除子视图【英文标题】:Remove Subview from Superview 【发布时间】:2014-07-24 12:52:53 【问题描述】:我真的被这个问题困扰了很长时间
我正在尝试将UIControl
(最后是UIView
)添加到我自己的类中有子类的UITableViewCell
(我创建了一个自定义单元格)
在滑动时,我创建了我的 UIControl
类并将其添加到我自己(单元格)中,到目前为止一切顺利。这是代码
[self addSubview:_statusView];
但是,我在自定义单元格中向我的UIControl
添加了一个目标操作,以便当UIControl
说他已经识别出一个 touchDownEvent 时,该单元格可以处理。
[self.statusView addTarget:self action:@selector(resetAll:) forControlEvents:UIControlEventTouchDown];
这是我想在动作中做的,我想从self.subviews
(单元格的子视图)中删除UIControl
,所以我将动作方法设置为这样
- (void)resetAll:(id)sender
for (UIView *view in self.subviews)
if ([view isKindOfClass:[StatusView class]])
[view removeFromSuperview];
有人能指出这段代码有什么问题吗?因为我真的不明白为什么添加到单元格的视图没有被删除。在我看来, subviews 属性从未包含我添加的UIControl
。
【问题讨论】:
是你的 resetAll: 选择器被调用 为什么不直接打电话给[sender removeFromSuperview]
?
resetALL:
确实被调用了。 sender
是活动吗?它不是我要删除的UIView
。
-(void)resetAll:(UIView *)sender [sender removeFromSuperview];
.
为什么我在这个问题上得到了-1的声誉?这个网站有时有点迟钝。
【参考方案1】:
- (void)resetAll:(id)sender
for (UIView *view in self.view.subviews)
if ([view isKindOfClass:[StatusView class]])
[view removeFromSuperview];
或
- (void)resetAll:(id)sender
[sender removeFromSuperview];
【讨论】:
第一个解决方案不能作为 resetAll: 方法在UITableViewCell
上调用并且它没有 view
属性
self.view.subviews
是什么意思? self 已经是 UIView 的单元格。
它对我有用。谢谢!for (UIView *view in self.view.subviews) if ([view isKindOfClass:[StatusView class]]) [view removeFromSuperview]; 【参考方案2】:
UITableViewCell
在内部对其视图层次结构进行一些操作。您不应该将子视图添加到单元格本身,而是添加到其contentView
,如docs 中所述:
如果你想超越预定义的样式,你可以添加子视图 到单元格的 contentView 属性。
所以你必须更换
[self addSubview:_statusView];
与
[self.contentView addSubview:_statusView];
然后迭代contentView
的子视图:
for (UIView *view in self.contentView.subviews)
if ([view isKindOfClass:[StatusView class]])
[view removeFromSuperview];
【讨论】:
我发现的最简单的解决方案,比子类化要容易得多。谢谢!以上是关于从 Superview 中删除子视图的主要内容,如果未能解决你的问题,请参考以下文章
当内部按钮触摸时,如何从 Superview 中删除以编程方式创建的子视图?
从SuperView的ViewController外部的类调用时,willRemoveSubview不会删除子视图吗?