在 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 中,您通常还使用 YESNO 而不是 TRUEFALSE。使用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的主要内容,如果未能解决你的问题,请参考以下文章

Cocoa Touch - 处理被打断或丢失的触摸

在 Cocoa/Cocoa Touch 中监控目录

在我们的 Cocoa/Cocoa-touch 应用程序中注册的应用程序委托在哪里

Cocoa Touch框架

在 Cocoa Touch 库中显示 UIWebView

核心数据到 Cocoa Touch 框架