2010-07-11 76 views
3

我试图观察复选框状态并在复选框状态更改时在应用程序中进行适当更改。在管理与复选框窗口中的窗口管理器我有以下观察员设置:键值观察和NSButton状态

- (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:方法从未被调用。

我在做什么错?

回答

7

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

编辑:

正确的keypath是“cell.state”。

+0

它不是零。它给了我NSButton的实例。当nib中的所有对象都被解除存档并且它们的连接已经建立时,awakeFromNib被调用。 – Eimantas 2010-07-11 15:35:44

+0

即使cell.state似乎可以正常工作,我也不认为NSButtonCell在任何情况下均被记录为符合KVO的“状态”。 NSCell可以通过许多访问器来表示值:setObjectValue :, setStringValue:,setIntegerValue :, setState:...观察integerValue和修改objectValue不会导致KVO通知,但是integerValue已经改变。 – 2010-07-11 18:28:36

+0

是的,好像看起来关键路径是错误的。谢谢! – Eimantas 2010-07-11 18:53:15

2

除非记录为符合关键值观测标准,否则不应指望给定类的访问者实施KVO支持。

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