【问题标题】:Using the value of a string to determine the instance of a class使用字符串的值来确定类的实例
【发布时间】:2010-10-28 19:37:01
【问题描述】:

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

提前感谢您的帮助!

【问题讨论】:

  • 我真的不了解 Objective-C,但这尖叫着糟糕的设计。您应该弄清楚如何传入实际的实例变量,这样就根本不需要字符串。
  • 同意。通常,switch 语句是一种代码异味,会向您大喊“多态性”,尽管在这种情况下没有足够的上下文来判断。

标签: iphone objective-c xcode


【解决方案1】:

我不同意那些关心设计的人,如果这实际上是代码的话。但是,我会假设您只是发布问题的一般化版本。而且由于这是Objective-C中的一个重要概念,所以我们应该讨论一下。

您可以使用键值编码和例程-valueWithKey: 按名称访问对象的属性。

NSString *nameOfView = @"imageView1";
[[self valueForKey:nameOfView] setHidden:YES];

这将依次查找名为-imageView1 的方法、名为imageView1 的ivar,最后是名为_imageView1 的ivar。这种技术在 Cocoa 中被大量使用,理解起来很重要。这是我们仔细命名事物的众多原因之一,也是我们制作访问器来为我们处理内存管理的另一个原因。在文档中搜索“Key-Value Compliance”以了解更多信息。

现在对于这种特定情况,我倾向于使用更像 JimG 的解决方案,使用 NSArray 视图,因此我可以循环浏览它们并根据它们的索引打开或关闭我想要的那些。但我可以想象很多不合适的情况,而 KVC 可能是。

【讨论】:

    【解决方案2】:

    为什么不将实例放在一个 NSArray 中并对其进行索引?

    NSArray *views = [NSArray arrayWithObjects: imageView1, imageView2, nil];
    NSImageView *iview = [views objectAtIndex: number];
    

    另外,你可以考虑如下:

    iview.hidden = ! iview.hidden;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      相关资源
      最近更新 更多