我有一个与此类似的switch语句:
switch (number)
{
case 1:
if (imageView1.hidden == NO)
{
imageView1.hidden = YES;
} else
{
imageView1.hidden = NO;
}
break;
case 2:
if (imageView2.hidden == NO)
{
imageView2.hidden = YES;
} else
{
imageView2.hidden = NO;
}
break;
依此类推。
我的问题是如何使用值为“imageView1”的字符串并使用它来访问我的imageView类的实例,而不是为每个imageView实例设置不同的大小写?我知道它类似于从字符串或类似的东西创建NSPath,但我只是不确定在哪里看或它将被称为。
提前感谢您的帮助!
答案 0 :(得分:5)
我不同意那些关心设计的人,如果这实际上是代码。但是,我会假设您只发布了问题的通用版本。由于这是Objective-C中的一个重要概念,因此我们应该讨论它。
您可以使用键值编码和例程-valueWithKey:
按名称访问对象的属性。
NSString *nameOfView = @"imageView1";
[[self valueForKey:nameOfView] setHidden:YES];
这将按顺序查找名为-imageView1
的方法,名为imageView1
的ivar,最后是名为_imageView1
的ivar。这种技术在Cocoa中被大量使用,并且很难理解。这是我们仔细命名的众多原因之一,也是我们为我们提供处理内存管理的访问器的另一个原因。在文档中搜索“Key-Value Compliance”以获取更多信息。
现在针对这个具体案例,我倾向于更像JimG的解决方案,使用NSArray视图,所以我可以循环遍历它们并根据它们的索引打开或关闭我想要的。但是我可以想象很多不适合的情况,而KVC可能会这样。
答案 1 :(得分:4)
为什么不将实例放在NSArray中并将其编入索引?
NSArray *views = [NSArray arrayWithObjects: imageView1, imageView2, nil];
NSImageView *iview = [views objectAtIndex: number];
此外,您可以考虑以下内容:
iview.hidden = ! iview.hidden;
[编辑:缺少星号,哎呀]