4

我正在尝试观察复选框状态并在复选框状态更改时在应用程序中进行适当的更改。在使用复选框管理窗口的窗口管理器中,我有以下观察者设置:

- (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:方法时,它永远不会被调用。

我究竟做错了什么?

4

2 回答 2

9

-awakeFromNib检查myCheckbox不为零。如果它为 nil,那么它在 IB 中没有正确连接。

编辑: NSButton.state具有与 相同的值NSButton.cell!.state,但它不是 Key-Value Observable。为了能够观察到该值,您需要使用\.cell!.state密钥路径。

于 2010-07-11T14:34:16.187 回答
2

除非记录为符合 Key Value Observing,否则不应期望给定类的访问器实现 KVO 支持。

按钮确实实现了键值绑定,因此您可以将布尔属性之一绑定到按钮的值绑定,而不是观察状态属性。

于 2010-07-11T18:26:09.170 回答