5

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

1 回答 1

6

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

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

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

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

我自己可能会使用绑定,我认为它的工作量较少,但目标-动作也非常好,而且更简单一些。


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

NSDictionary *bindingInfo = [self infoForBinding:NSValueBinding];
[[bindingInfo valueForKey:NSObservedObjectKey] setValue:self.integerValue
                                             forKeyPath:[bindingInfo valueForKey:NSObservedKeyPathKey]];
于 2012-05-15T17:07:03.073 回答