无法通过 setHidden 隐藏 UIImageView:

Posted

技术标签:

【中文标题】无法通过 setHidden 隐藏 UIImageView:【英文标题】:Can't hide UIImageView via setHidden: 【发布时间】:2014-08-18 17:10:54 【问题描述】:

我有一个自定义 UITableViewCell,我在其中创建了一个这样的图标:

self.icon = [[UIImageView alloc] initWithFrame:CGRectMake(15, 15, 50, 50)];
[self.icon setImage:[AppearanceProxyController getImageForAssetIdentifier:@"import"]];
[self addSubview:self.icon];

效果很好。另外还有我隐藏图标的方法:

-(void)hideIcon
    dispatch_async(dispatch_get_main_queue(), ^
        [self.icon setHidden:true];
    );

which ... 完全没有效果,我也不知道为什么。 当从它的 tableviewcontroller 中点击单元格时调用该方法。

检查表明它是隐藏的,但事实并非如此。

UIImageView: 0x17d37d20; frame = (15 15; 50 50); hidden = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x17f8f4c0>> is hidden: 1

将 uiimage 设置为 nil 或将 alpha 设置为 0.0 也没有效果。我做错了什么?

【问题讨论】:

你确定你隐藏了正确的实例吗?例如,您是否曾多次创建图像视图并忘记removeFromSuperview 旧实例?在您创建图像视图的位置设置断点,并检查是否比您预期的更频繁地到达该断点。 如果你在没有调度块的情况下这样做会发生什么?结果一样吗? 好提示@DarkDust!我刚刚意识到我的 awakeFromNib 被调用了两次,因为我通过[self.tableView cellForRowAtIndexPath: ...] 而不是[tableView cellForRowAtIndexPath:...] 获得了我的单元格didSelectRowAtIndexPath:。这导致了一个新的 imageView,它没有明显隐藏。我很乐意接受这个作为你的答案。 【参考方案1】:

您可能有多个UIImageView 实例,但只有一个对最新实例的引用。当你隐藏它时,你会看到下面的旧实例(如果它们显示相同的图像)看起来隐藏不起作用。

因此,您需要确保在旧实例上调用 removeFromSuperview,或者需要确保您不会创建多个实例。

【讨论】:

【参考方案2】:

您的问题是您在每个 uitableview 单元格中创建 self.icon 。 您每次都分配初始化图标,因此 self.icon 保存您分配初始化的最后一个对象。如果你隐藏 self.icon 那么它会隐藏最后一个对象。

所以如果你想隐藏一些图像视图,只需像这样在你的隐藏图标方法中传递这个对象

-(void)hideIcon : (UIImageView *)imageView
    dispatch_async(dispatch_get_main_queue(), ^
       [imageView setHidden:true];
    );

当你想隐藏时调用它

【讨论】:

但 self.icon 在我的自定义 UITableViewCell 类中,因此它应该始终只保存自己唯一图标实例的引用。问题是在点击单元格时再次调用 awakeFromNib 导致“重置”

以上是关于无法通过 setHidden 隐藏 UIImageView:的主要内容,如果未能解决你的问题,请参考以下文章

NSComboBox 动作选择器在 setHidden:YES 时触发

隐藏另一个类的自定义按钮

隐藏collectionview单元格时关闭空间?

使用 NSLider 的 setHidden 不起作用 - Objective C

IOS7 UIPickerView如何隐藏选择指示器

将 UIButton 放置在与 UITabBar 相同的空间中(隐藏时)