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



我有一个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];
}

您可以使用目标操作或可可绑定:

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

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

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

我自己可能会使用绑定,我认为这工作量更少,但目标操作也很好,而且更直接一些。


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

NSDictionary *bindingInfo = [self infoForBinding:NSValueBinding];
[[bindingInfo valueForKey:NSObservedObjectKey] setValue:self.integerValue
                                             forKeyPath:[bindingInfo valueForKey:NSObservedKeyPathKey]];

最新更新