objective-c - 使用 Cocoa Bindings,以编程方式更改 NSTextField 的值不会更新模型

标签 objective-c xcode cocoa cocoa-bindings nstextfield

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

但我正在尝试实现一个 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];
}

最佳答案

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

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

  2. Cocoa 绑定(bind):将文本字段的值绑定(bind)设置为模型对象的符合 KVO 的属性。然后您可以更新单元格的值, Binder 将为您更新模型对象。

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

我自己可能会使用绑定(bind),我认为这工作量较小,但目标- Action 也非常好,而且更直接一些。


确实,您确实说过“绑定(bind)”。我认为对文本字段的编程更改会触发更新,但事实并非如此,您可以自己更新绑定(bind)值。下面是一些您可以尝试的代码:

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

关于objective-c - 使用 Cocoa Bindings,以编程方式更改 NSTextField 的值不会更新模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10604104/

相关文章:

ios - 我们如何使用 facebook graph api 获取用户的生日?

ios - UITextfield 限制汉字长度

ios - 实例变量会限制性能吗?一个类应该有两个目的吗?

ios - 为什么我可以通过XCode在设备上运行我的应用程序,但不能对其进行配置文件?

ios - 如何在 UIWebView swift 中自动播放 YouTube 视频

ios - 将文本从 View 中的 TextLabel 传递到另一个 View 中的标签

xcode - 使用 Interface Builder 完成的 Cocoa GUI 在我的机器上布局正确,在另一台机器上布局错误

objective-c - 检查复杂 JSON 响应中的空键

xcode - Xcode 7.3.1 可以在 macOS 10.12 上运行吗?

objective-c - cocoa block 作为强指针与复制