从superview中删除所有实例

时间:2012-01-12 19:24:38

标签: iphone ios xcode ipad

我正在尝试使用以下代码删除屏幕上的所有Sprite(UIImageViews):

-(IBAction)clearAll:(id)sender{
      for (Sprite *sprite in self.view.subviews){
      [sprite removeFromSuperview];
}

但是,当此代码运行时,我的Storyboard中的非精灵的元素将被删除。实际上,视图中的所有内容都已被删除。

发生了什么事?

4 个答案:

答案 0 :(得分:3)

这不是in循环的工作方式。仅仅因为您指定了类型,并不意味着只会影响该类型的对象。 subviews中的每个视图都会响应removeFromSuperview,因此无论它被投射为什么,它都会被移除。

如果只想删除Sprite个对象,则需要检查每个对象的类。

for (UIView *view in self.view.subviews)
{
    if ([view isKindOfClass:[Sprite class]])
        [view removeFromSuperview];
}

答案 1 :(得分:1)

在这种情况下,子视图包含所有内容(精灵和其他对象)。你的枚举不仅返回精灵 - 它返回所有东西(但是松散地'把它们'铸造成精灵)。在这种情况下,作为子视图的所有内容都会响应removeFromSuperview方法 - 因此所有内容都会被删除。

您需要在遍历子视图时检查对象的类型,以确定是否需要删除它。

答案 2 :(得分:1)

我们可以使用以下语句从SuperView中删除所有UIView类型的实例。

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

它看起来更干净,更简单而不是循环。

答案 3 :(得分:0)

您的代码在self.view的所有子视图上调用removeFromSuperview,因此在编写时正常工作。这段代码运行的原因是因为Sprite可能是UIView的子类,所以编译器不会出错/警告你。你需要做的更像是这样:

-(IBAction)clearAll:(id)sender{
    for (UIView *aSubview in self.view.subviews){
    if ([aSubview isSubclassOf
    [sprite removeFromSuperview];
}