removeFromSuperview UIImageView 不工作

Posted

技术标签:

【中文标题】removeFromSuperview UIImageView 不工作【英文标题】:removeFromSuperview UIImageView not working 【发布时间】:2016-05-17 08:55:42 【问题描述】:

我正在尝试使用以下代码从现有视图中删除图像:

-(void) deleteImage:(int)imageID

//[self.imageArray removeObjectAtIndex:imageID];
//remove the image from the screen
for (UIView* view in self.view.subviews) 
    if ([view isKindOfClass:[UIImageView class]] && [view tag] == imageID) 
        //could be a bug here with the re-Ordering of the array (could add a helper method to reset all the tags on screen when this is called
        NSLog(@"view %@", view);
        //[self.imageArray removeObjectAtIndex:imageID];
        [view removeFromSuperview];
    
  

NSLog 输出以下内容:

view <UIImageView: 0x18b8d7b0; frame = (0 0; 768 2016); autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x18b8d890>>

我遇到的问题是它似乎正在获取 ImageView 但它没有删除它。

【问题讨论】:

能否请您详细说明一下要求。您真的需要删除imageView 本身还是只清除imageView 显示的图像? @GoGreen 我需要删除 imageView 本身 在从 superView 中删除之前,您已经记录了该语句。尝试在 for 语句之后循环遍历子视图以检查 imageView 是否仍然存在。此外,这不是删除子视图的理想方式。通过将其添加为propertyinstance variable 来保留对要删除的视图的引用。然后,您可以使用此参考将其删除。请再次检查。 【参考方案1】:

由于您尝试修改用户界面,因此您必须在主线程上进行。因此,请执行以下操作:

dispatch_async(dispatch_get_main_queue(), ^
    [view removeFromSuperview];
);

【讨论】:

【参考方案2】:

首先,当您向视图询问其子视图时,您会得到一个子视图数组的副本,因此摆弄该副本数组对您没有任何好处。

其次,原则上,当您尝试删除子视图时应该会崩溃,因为您使用的是快速枚举,它禁止在枚举中更改集合。

最后,删除视图的子视图的正确方法是使用 removeFromSuperview 方法,这意味着您确实需要保留对相关图像视图的引用。

本质上,您应该使用标题为“管理视图层次结构”的 UIView 部分中提供的方法,而不是使用实际的子视图数组本身。这是可能使子视图层次结构进入不一致状态的秘诀。

【讨论】:

以上是关于removeFromSuperview UIImageView 不工作的主要内容,如果未能解决你的问题,请参考以下文章

removeFromSuperview 随机崩溃

removeFromSuperview() 耗时过长

removeFromSuperview() 并不总是有效

无法使用 removeFromSuperview 方法删除视图

关于removeFromSuperview

removeFromSuperview 无法正常工作