gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:51:20 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com