我试图观察复选框的状态,并在复选框状态改变时在应用程序中做出适当的改变。在一个管理有复选框的窗口管理器中,我有以下的观察者设置,我还把myCheckBox连接到文件所有者(也就是窗口控制器)和窗口中适当的复选框。
- (void)awakeFromNib
{
[myCheckBox addObserver:self
forKeyPath:@"state"
options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
context:NULL];
}
- (void)dealloc
{
[myCheckBox removeObserver:self forKeyPath:@"state"];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"KeyPath: %@", keyPath);
NSLog(@"ofObject: %@", object);
NSLog(@"change: %@", change);
}
我还将myCheckBox连接到文件所有者(也就是窗口控制器)和窗口中适当的复选框。然而当我运行我的应用程序时 observeValueForKeyPath:ofObject:change:context:
方法从未被调用。
我到底做错了什么?
在 -awakeFromNib
确认 myCheckbox
不是零。如果是nil,那么它在IB中就没有正确连接。
编辑。 NSButton.state
有相同的值 NSButton.cell!.state
,但它不是Key-Value Observable。为了能够观察到这个值,你需要使用 \.cell!.state
键路径。
除非文档中说明是符合键值观察的,否则你不应该期望给定类的访问器实现KVO支持。
按钮确实实现了键值绑定,所以你可以不观察状态属性,而是将你的一个布尔属性绑定到按钮的值绑定。