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チェックではmyCheckboxnil ではありません。nil の場合、IB で適切に接続されていません。

編集: NSButton.stateと同じ値を持ちますが、NSButton.cell!.stateKey-Value Observable ではありません。値を観察できるようにするには、\.cell!.stateキー パスを使用する必要があります。

于 2010-07-11T14:34:16.187 に答える
2

Key Value Observing 準拠であることが文書化されていない限り、特定のクラスのアクセサーが KVO サポートを実装するとは思わないでください。

ボタンはキーと値のバインドを実装しているため、状態プロパティを観察する代わりに、ブール属性の 1 つをボタンの値のバインドにバインドできます。

于 2010-07-11T18:26:09.170 に答える