使用字符串的值来确定类的实例

时间:2009-05-25 20:03:55

标签: iphone objective-c xcode

我有一个与此类似的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,但我只是不确定在哪里看或它将被称为。

提前感谢您的帮助!

2 个答案:

答案 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;

[编辑:缺少星号,哎呀]