【问题标题】:UIImage that won't disappear when removing it from its superview [closed]从超级视图中删除它时不会消失的 UIImage [关闭]
【发布时间】:2012-01-30 14:03:19
【问题描述】:

在 iOS 5 下,我遇到以下问题:每次在应用程序中选择新产品时,都会在控制器上调用以下代码。它会在控制器的视图中显示功能的项目符号列表。

每个项目符号都是添加在正确位置(在相应文本前面)的图像。

现在,问题是有时,显然是随机的,一些项目符号没有从以前的项目符号列表中删除,尽管我在方法开始时将其从其超级视图中删除。

  - (void) loadProduct{
    for (UIView * bullet in bullets){
        bullet.hidden = YES;
        [bullet removeFromSuperview];
    }
    [bullets removeAllObjects];
    [self.view setNeedsDisplay];


   ......here some stuff ......


    for (int i=0;i< numberOfFeatures;i++)
    {   

            UIImageView * bullet = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"bullet.png"]];
            bullet.frame =CGRectMake(someFloatValue ,
                                     someOtherFloatValue,
                                     6,
                                     6);
            [self.view addSubview:bullet];

            [bullets addObject:bullet];
            [bullet release];

        }
    }

bullets 是一个 NSMutableArray,是控制器的一个属性。

我在这里做错了吗?

【问题讨论】:

  • 您的代码看起来不错。子弹的所有物体都将被移除。当你有些子弹没有被移除时,是在数组中还是在显示中?
  • 感谢 babbidi,他向我暗示了竞争条件,我发现了错误:该方法几乎同时被调用了两次。

标签: objective-c uiviewcontroller ios5 imagenamed


【解决方案1】:

bullets 中,您似乎只存储了标签:

[bullets addObject:label];

因此,当从bullets 中删除所有内容时,您只是从超级视图中删除标签,项目符号(UIImageView 控件)保留在那里。

如果您创建一个自定义控件(同时包含项目符号和标签的视图)并改用它们,可能会更容易

【讨论】:

  • 您对我最初发布的代码完全正确,但这只是我在简化代码以放入 SO 时犯的一个错误。原代码中没有这个错误,我这里从代码中编辑出来。
  • 我明白了,现在一切正常。您是否从任何其他地方从bullets 中删除对象?另一个可能的问题是竞争条件(仅当您从多个线程访问bullets 时)。
  • 非常感谢您对比赛条件的评论!我只是在方法中放了一个断点,在某些情况下,它似乎几乎同时被调用了两次。这可能解释了它。非常感谢。也就是说,我将删除这个问题,因为它没有多大意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多