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

时间:2013-11-05 22:25:03

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

我有几个使用绑定来获取其值的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用于依赖数据完整性的事情,例如:一个温度历史,所以我想避免发送假值变化事件。

2 个答案:

答案 0 :(得分:1)

你试过了吗?

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

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

我使用willChangeValueForKey:后跟didChangeValueForKey:时遇到问题我想可能问题是您应该使用@"_temperature"代替@"temperature"

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

答案 1 :(得分:0)

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