2010-07-11 94 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支持。

按鈕確實實現了鍵值綁定,所以不是觀察狀態屬性,而是將一個布爾屬性綁定到按鈕的值綁定。