2

我有几个 NSTextFields 使用绑定来获取它们的值。每个文本字段都有一个自定义的 NSFormatter 附加,用于格式化值。

现在我想改变这个 NSFormatter 的格式,我通过在 NSUserDefaults 中设置一个键来做到这一点。格式化程序监听 NSUserDefaultsDidChangeNotification。只要支持绑定的值发生更改,这就会起作用。如果该值未更改,则 NSTextField 不会更新。

如果格式化程序更改了格式,刷新 NSTextField 的正确方法是什么?

在最好的情况下,我既不需要引用 NSTextField 也不需要引用 NSFormatter。在整个应用程序中,有各种温度标签都应该转换它们的格式。我希望能够从 NSFormatter 内部启动“绑定刷新”。也许我错过了 NSNotification?

我尝试发送willChangeValueForKey:didChangeValueForKey:KVO 通知,但没有奏效。
现在我正在使用一种相当老套的方式,我只是稍微改变一下这个值。

- (IBAction)temperatureMenuDidSelect:(NSMenuItem *)sender {
    [[NSUserDefaults standardUserDefaults] setInteger:sender.tag forKey:MBUserDefaultsTemperatureSystemKey];
    // refresh. this is an ugly hack, maybe there is a nicer way?
    self.selectedDevice.temperature += 0.000001;
//    [self.selectedDevice willChangeValueForKey:@"temperature"];
//    [self.selectedDevice didChangeValueForKey:@"temperature"];
}

正如您可以想象的那样,这两种方式都不是一个好主意。它现在可以工作,因为我只是在显示值。但是我阻止了未来将 KVO 用于依赖数据完整性的事情的选项,例如温度历史,所以我想避免发送虚假的值更改事件。

4

2 回答 2

1

你有没有尝试过:

self.selectedDevice.temperature = self.selectedDevice.temperature;

这可能是一个与这里的内容绑定的问题。您的 NSTextField 是否受 keypath 的约束selectedDevice.temperature?也许您需要使用@"selectedDevice.temperature"key 参数。

我从来没有遇到过使用的问题willChangeValueForKey:didChangeValueForKey:我想也许问题是你应该使用@"_temperature"key 而不是@"temperature".

再说一次,我从来没有尝试在除self. 您是否尝试过在内部实现更新方法selectedDevice来执行 KVO 通知?我不知道为什么它会有所作为,但我从来没有遇到过刷新值的问题

于 2013-11-05T22:33:13.537 回答
0

在您的 xib 内部检查器中,只需检查选项立即验证并持续更新。

于 2013-11-06T06:21:14.670 回答