使用Cocoa绑定,以编程方式更改NSTextField的值不会更新模型

Dru*_*erB 5 xcode cocoa objective-c nstextfield cocoa-bindings

我有一个NSTextField绑定到我的模型.如果以编程方式更改文本字段的内容,则不会更新模型.我知道你应该更新模型.

但是我正在尝试实现一个NSTextField子类,它可以在鼠标悬停在它上面时识别滚动以更改它的数值.显然我无法从这个子类访问该模型.所以你有什么建议我怎么做?

解决方案(感谢noa):

- (void)scrollWheel:(NSEvent *)theEvent {
    [self setFloatValue:[self floatValue] - [theEvent deltaY]];
    NSDictionary *bindingInfo = [self infoForBinding: NSValueBinding];
    NSObject *boundObject = [bindingInfo valueForKey:NSObservedObjectKey];
    NSString *keyPath = [bindingInfo valueForKey:NSObservedKeyPathKey];
    [boundObject setValue:[NSNumber numberWithFloat:[self floatValue]]
               forKeyPath:keyPath];
}
Run Code Online (Sandbox Code Playgroud)

pau*_*kow 6

您可以使用target-action或Cocoa Bindings:

  1. 目标操作:将文本字段的操作选择器连接到控制器的某个updateValue操作.然后,在文本字段中,在更改文本字段的值后调用选择器.该操作应获取文本字段的值并将其传播到模型.

  2. Cocoa Bindings:将文本字段的Value绑定设置为模型对象的KVO兼容属性.然后,您可以更新单元格的值,绑定器将为您更新模型对象.

这些特定设计的优点是文本字段和模型属性之间的耦合可以通过绑定或目标来处理.如果要将文本字段用于其他属性,则可以使用不同的操作或不同的绑定,而无需修改自定义文本字段代码.

我可能会使用绑定,我自己,我认为它的工作量较少,但目标操作也非常好,而且更直接.


的确,你确实说过了"绑定".我认为对文本字段的编程更改会触发更新,但由于情况并非如此,您可以自己更新绑定值.这是您可以尝试的一些代码:

NSDictionary *bindingInfo = [self infoForBinding:NSValueBinding];
[[bindingInfo valueForKey:NSObservedObjectKey] setValue:self.integerValue
                                             forKeyPath:[bindingInfo valueForKey:NSObservedKeyPathKey]];
Run Code Online (Sandbox Code Playgroud)