【问题标题】:With Cocoa Bindings, changing the value of NSTextField programmatically does not update the model使用 Cocoa 绑定,以编程方式更改 NSTextField 的值不会更新模型
【发布时间】:2012-05-23 03:55:38
【问题描述】:

我有一个 NSTextField 绑定到我的模型。如果我以编程方式更改文本字段的内容,则模型不会更新。我知道你应该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];
}

【问题讨论】:

    标签: objective-c xcode cocoa cocoa-bindings nstextfield


    【解决方案1】:

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

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

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

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

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


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

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

    【讨论】:

    • 正如我所说,我正在使用绑定。我的文本字段的值绑定到我的模型对象的符合 KVO 的属性。我的问题是,绑定仅在我手动更改文本字段的值时更新模型对象的属性,而不是在以编程方式更改时。
    • 我的错误,我认为对绑定控件的编程更新确实更新了模型。我会寻找一些代码来发布。
    • 不幸的是,事实并非如此。感谢您的帮助!
    • 非常感谢,成功了!我不得不将值包装在一个 NSNumber 对象中,但它现在可以工作了。我用我最终使用的内容更新了我的问题。我悬赏了一个较旧的相同问题。如果你在那里回答,我可以奖励给你。否则,我将链接到这个问题作为答案。 stackoverflow.com/questions/8310236/…
    • 谢谢!我就是这么做的。另外,我记得 Cocoa 有用于绑定名称的常量,并更新了我的代码以反映这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多