在 Cocoa Touch 中隐藏 UIImageView
Posted
技术标签:
【中文标题】在 Cocoa Touch 中隐藏 UIImageView【英文标题】:Hiding a UIImageView in Cocoa Touch 【发布时间】:2012-01-09 22:45:55 【问题描述】:我想在我的程序中切换显示图像。这是我的代码简化:
UIImage *newImage = [UIImage imageNamed:@"selected.png"];
UIImageView *selector = [[UIImageView alloc] initWithImage: newImage];
[selector setFrame: CGRectMake( 0, 0, 64, 64)];
[overView addSubview: selector];
[overView bringSubviewToFront: selector];
selector.hidden = TRUE;
[newImage release]
后面的代码:
-(IBAction)Button1Click
selector.hidden = FALSE;
-(IBAction)Button2Click
selector.hidden = TRUE;
稍后:
[selector release];
当我运行并单击两个按钮时,“选择器”图像永远不会出现。如果我调试程序,我可以看到程序到达 IBActions 下的行,但它没有效果。奇怪的是:如果我早早设置线路:
selector.hidden = FALSE;
然后我可以一直看到“选定”的图像,无论我按什么按钮,它都不会关闭。有什么想法吗?
更新: 我知道代码中不清楚,但“选择器”在所有代码中都在同一范围内。添加“自我”。到“选择器”解决了这个问题。谢谢!
【问题讨论】:
看看这个:***.com/questions/7334624/… 不确定这是否与您的问题有关,但您不应该释放从imageNamed:
返回的图像(它已经自动释放)。在 Objective-C 中,您通常还使用 YES
和 NO
而不是 TRUE
和 FALSE
。使用addSubview:
后,bringSubviewToFront:
是不必要的,因为无论如何它都会将其添加为最顶层的子视图。
如果selector
实际上在范围内以及它在不同点实际指的是什么,提供的代码不清楚
不要将标题更新为 SOLVED - 您已接受答案,每个人都可以看到。 (干得好!)
【参考方案1】:
从您的代码 sn-ps 看来,您有属性“selector”(在 IBActions 中访问)和“main”sn-p 中使用的局部变量“selector”。如果是这种情况,您必须执行以下操作:
self.selector = [[UIImageView alloc] initWithImage: newImage];
而不是
UIImageView *selector = [[UIImageView alloc] initWithImage: newImage];
【讨论】:
【参考方案2】:在您的情况下,方法“Button1Click”(和另一个)“选择器”是未知的,因为它是在此处本地声明的:UIImageView *selector = ...
。
您需要正确引用它,可以通过您的按钮单击方法访问它。您可以在 *.h 文件中声明它,然后在类中的任何位置使用它,然后在最后释放它(在 dealloc 方法中)。
当然你不应该发布这个 UIImage。请阅读有关内存管理的 Apple 文档。没有它真的很难走得更远:)
我认为安德烈的回答是正确的,但对于新鲜人来说太短了。
【讨论】:
大概就是这个了。我怀疑提问者忽略了一个警告,他声明了一个名为selector
的实例变量(没有它,操作将无法编译)和一个名为 selector
的局部变量(如第一个代码 sn-p 中所示问题),在这种情况下,后者会影响(阻止其范围访问)前者。无论是那个代码还是第一个代码 sn-p 都与动作在不同的类中,在这种情况下,它们是独立的变量,彼此没有关系。
顺便说一句,你不需要在头文件中声明实例变量,我建议不要这样做。在类自己的 .m 文件中的 @implementation
中声明它们。没有任何其他班级应该看到它们的理由。【参考方案3】:
UIImageView *selector = [[UIImageView alloc] initWithImage: newImage];
看起来它正在“遮蔽”您的选择器 ivar。查看您的 @interface 并查看选择器是否也在 ivar 列表中。如果是这样,那么只需删除 UIImageView * 部分。
查看http://en.wikipedia.org/wiki/Variable_shadowing 了解更多信息。您还可以在 Xcode 中打开一个警告标志,当它遇到一个警告标志时会向您发出警告。令人惊讶的是,它默认不开启。
【讨论】:
【参考方案4】:试试这个
UIImageView *selector = [[[UIImageView alloc] initWithImage: newImage] autorelease];
【讨论】:
以上是关于在 Cocoa Touch 中隐藏 UIImageView的主要内容,如果未能解决你的问题,请参考以下文章