无法通过 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 时触发