键值观察和NSButton状态

问题描述 投票:4回答:2

我试图观察复选框的状态,并在复选框状态改变时在应用程序中做出适当的改变。在一个管理有复选框的窗口管理器中,我有以下的观察者设置,我还把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: 方法从未被调用。

我到底做错了什么?

cocoa key-value-observing nsbutton
2个回答
8
投票

-awakeFromNib 确认 myCheckbox 不是零。如果是nil,那么它在IB中就没有正确连接。

编辑。 NSButton.state 有相同的值 NSButton.cell!.state,但它不是Key-Value Observable。为了能够观察到这个值,你需要使用 \.cell!.state 键路径。


2
投票

除非文档中说明是符合键值观察的,否则你不应该期望给定类的访问器实现KVO支持。

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

© www.soinside.com 2019 - 2024. All rights reserved.