Cocoa 是否将NSTextField绑定到对象实例方法?

Cocoa 是否将NSTextField绑定到对象实例方法?,cocoa,core-data,cocoa-bindings,Cocoa,Core Data,Cocoa Bindings,我在一个对象上有一个实例方法,它根据一些其他对象吐出一个字符串。我可以将此实例方法绑定到字段吗?创建NSString属性,打开nib文件并将文本字段的值绑定到属性。然后,对属性所做的任何更改都将反映在文本字段中。只有在为绑定实现相应的setter方法以尝试将值中的更改写入时,才能将getter实例方法绑定到字段的值。其他一些绑定类型不需要setter setter为空是可以的 例如,这用于显示实例子树中的新项目数: - (NSNumber*) numberOfNewItems { NSU

我在一个对象上有一个实例方法,它根据一些其他对象吐出一个字符串。我可以将此实例方法绑定到字段吗?

创建NSString属性,打开nib文件并将文本字段的值绑定到属性。然后,对属性所做的任何更改都将反映在文本字段中。

只有在为绑定实现相应的setter方法以尝试将值中的更改写入时,才能将getter实例方法绑定到字段的值。其他一些绑定类型不需要setter

setter为空是可以的

例如,这用于显示实例子树中的新项目数:

- (NSNumber*) numberOfNewItems
{
    NSUInteger total = 0;

    for (childItem* ci in self.items)
        total += (ci.isNewValue) ? ci.items.count : 0;

    return @(total);
}

// Does nothing but allows binding to above to be recalculated
- (void) setNumberOfNewItems:(NSNumber*)number { }
这让双向绑定很开心。如果没有setter,则会出现与密钥路径不符合KVC相关的错误。除非您绑定到单向的东西,比如标题或工具提示,否则这些不需要设置器。但是setter可以方便地通过getter重新计算这些标题和工具提示

请注意,在childItems中,您可以执行以下操作:

self.isNewValue = NO;
[self.parent setNumberOfNewItems:nil]; // Trigers KVO for binding (does nothing else)
。。。这比尝试让父对象注册为所有子对象的KVO观察器要容易得多

如果希望实例中的其他属性重新触发getter,可以添加以下类方法:

+ (NSSet *)keyPathsForValuesAffectingNumberOfNewItems {
    return [NSSet setWithObjects:@"items", @"somethingElse", nil];
}

不要忘记实现KeyPathForvaluesFect。然后,您以符合KVC的方式对依赖属性所做的任何更改都将自动触发观察该属性的任何内容,例如字段,以便再次检索该属性。您不必将其设置为@property。一个实例方法,只要它不带任何参数,就会表现出等价的行为。但是你必须发送你自己的KVO通知,所以不,它不会表现出等价的行为。不是真的。试试看。声明为:-NSString*值;-voidsetValue:NSString*值;并定义为-NSString*value{return{u value;}-voidsetValue:NSString*value{if![[u value IsequalString:value]{[\u value autorelease];[u value=[value retain];}}}我在设置值时确实会收到KVO通知。将值绑定到不受属性支持的字符串生成方法可能看起来很奇怪,但你可以照ipmcc说的做。它方便的地方是做一些类似于将按钮标题绑定到实例方法的事情。永远不会调用setter的绑定。您已经让getter根据当前实例状态生成任意字符串。setter是空的。对于要重新生成显示字符串的代码的任何其他部分,只需调用空setter,KVO负责重新调用getter。