我有几个 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 用于依赖数据完整性的事情的选项,例如温度历史,所以我想避免发送虚假的值更改事件。