如何在格式化程序更改其格式时刷新NSTextField?

我有几个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处理依赖数据完整性的事情,例如温度历史记录,所以我想避免发送虚假的价值变化事件。


你有没有尝试过:

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

这可能是一个什么与这里绑定的问题。 您的NSTextField是否被selectedDevice.temperature的关键路径所约束? 也许你需要使用@"selectedDevice.temperature"作为关键参数。

我从来没有遇到过使用willChangeValueForKey:的问题willChangeValueForKey:后面跟着didChangeValueForKey:我想也许问题是你应该使用@"_temperature"作为键而不是@"temperature"

然后,我再也没有尝试在self以外的对象上调用这些方法。 您是否尝试过在selectedDevice内部实施更新方法来执行KVO通知? 我不知道为什么它会有所作为,但我从来没有问题刷新价值


在你的xib内部检查员只是检查选项立即验证并不断更新。

链接地址: http://www.djcxy.com/p/85249.html

上一篇: How to refresh NSTextField when its formatter changes its format?

下一篇: NSTextField and FirstResponder