我有几个使用绑定来获取其值的NSTextField。每个文本字段都附加一个自定义的NSFormatter,用于格式化值。
现在我想更改此NSFormatter的格式,我通过在NSUserDefaults中设置一个键来实现。格式化程序侦听NSUserDefaultsDidChangeNotification。只要支持绑定的值发生更改,此方法就可以正常工作。如果未更改该值,则NSTextField不会更新。
如果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用于依赖数据完整性的事情,例如:一个温度历史,所以我想避免发送假值变化事件。
答案 0 :(得分:1)
你试过了吗?
self.selectedDevice.temperature = self.selectedDevice.temperature;
这可能是一个什么与这里的约束有关的问题。您的NSTextField是否被selectedDevice.temperature
的密钥路径绑定?也许您需要使用@"selectedDevice.temperature"
作为关键参数。
我使用willChangeValueForKey:
后跟didChangeValueForKey:
时遇到问题我想可能问题是您应该使用@"_temperature"
代替@"temperature"
。
然后我再次尝试在self
以外的对象上调用这些方法。您是否尝试在selectedDevice
中实施更新方法来执行KVO通知?我不知道为什么它会有所作为,但我从未遇到过刷新值的问题
答案 1 :(得分:0)
在你的xib内部检查员只需检查选项立即验证并不断更新。