代码之家  ›  专栏  ›  技术社区  ›  Richard

将属性访问器转发到ivar的方法

  •  0
  • Richard  · 技术社区  · 14 年前

    我有一个对所选表格行进行详细说明的面板。显然,面板的显示经常需要更新,我已经将该任务推到了nswindowcontroller子类中。

    我希望自定义nswindowcontroller @property 用于文本字段中的字符串值和nsImageView中的图像值。因为我不需要在访问器中使用新代码,所以我想 @synthesize 他们。不幸的是(对我来说),在 @synthesize property=ivar .

    显而易见的解决方案是编写我自己的窗体访问器

    - (void)setTitle:(NSString *)title
    {
        [titleTextField setStringValue:title];
    }
    
    - (NSString *)title
    {
        return [titleTextField stringValue];
    }
    

    但我不想为每个属性手工操作。

    有更简单的方法吗?可能是设置属性以转发到特定属性的一般方法(除了 objectValue 等等,不是另一个物体的正确属性吗?

    3 回复  |  直到 14 年前
        1
  •  0
  •   Mike Weller    14 年前

    我认为做任何类型的转发都不会有用,因为textfield上的属性名将不同于类中的属性名。

    当然,通过暴露一个字符串属性从text field中抽象出来是一个好主意,但是如果您想避免编写这个锅炉板,您可能会发现简单地将文本字段本身暴露为属性是可以接受的。你可以在苹果的一些API中看到这一点,特别是在iPhone上,在SDK3.0中,它没有像 text 在他们现在拥有的一个表单元上 textLabel . 如果被叫方希望以某种方式自定义标签或文本字段,它更简单,允许进行更多的自定义。

        2
  •  1
  •   Justin Spahr-Summers    14 年前

    如果你实施 valueForUndefinedKey: 在您的类中,您应该有最后一次机会解析任何键值路径查找,并将它们全部转发给另一个对象。不过,这当然不是性能,只有当您要传递的大多数属性名与目标对象的属性名匹配时,这才会给您带来显著的收益。

        3
  •  0
  •   hooleyhoop    14 年前

    你有一个矛盾,你说你不需要在附件中有新颖的代码,所以你想综合它们,但是你需要的代码是完全新颖的。在一些常见的情况下,属性是句法上的糖分,而这不是一个。

    有几种方法可以满足您的需要,例如@justin建议覆盖setvalue:forundefinedkey:-您只需要查找正向目标,但属性的糖分不适合这样做。