转发ivar方法的属性访问器

时间:2010-11-28 18:58:22

标签: cocoa properties key-value-coding

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

我希望自定义NSWindowController具有@property s,例如文本字段中的字符串值和NSImageViews中的图像值。因为我不需要访问器中的新代码,所以我想@synthesize。不幸的是(对我来说),没有选项可以在@synthesize property=ivar中使用密钥路径。

显而易见的解决方案是编写自己的

形式的访问器
- (void)setTitle:(NSString *)title
{
    [titleTextField setStringValue:title];
}

- (NSString *)title
{
    return [titleTextField stringValue];
}

但我不想为每个属性手动执行此操作。

有更简单的方法吗?设置属性以转发到另一个对象的特定属性(objectValue等除外)的通用方法可能不是另一个对象的实际属性吗?

3 个答案:

答案 0 :(得分:1)

如果在类中实现valueForUndefinedKey:,您应该有机会解决任何键值路径查找并将它们全部转发到另一个对象。但是,这当然不具备高效性,只有当您通过的大多数属性名称与目标对象的名称相匹配时,才会给您带来显着的收益。

答案 1 :(得分:0)

我认为进行任何类型的转发都不会有用,因为文本字段上的属性名称将与您班级中的属性名称不同。

通过公开字符串属性从文本字段中提取当然是一个好主意,但是如果你想避免编写这个样板,你可能会发现将文本字段本身作为属性公开是可以接受的。您可以在某些Apples API中看到这一点,特别是在SDK 3.0中的iPhone上,而不是在表格单元格上具有text等属性,而现在它们textLabel。它更简单,如果被调用者想以某种方式自定义标签或文本字段,则允许更多自定义。

答案 2 :(得分:0)

你有一个矛盾,你说你在加法器中不需要新的代码,所以你想要合成它们,但你需要的代码是完全新颖的。属性是一些常见情况的语法糖,其中不是一个。

有几种方法可以做你想要的,例如。正如@Justin建议重写setvalue:forundefinedkey: - 你只需要查找前向目标,但属性的糖不适合这个。