11

ブールプロパティでNSObjectメソッドを監視するキー値を使用しています。

-(void)observeValueForKeyPath:(NSString *)keyPath
                     ofObject:(id)object
                       change:(NSDictionary *)change
                      context:(void *)context 

このキーパスの値の最も興味深い部分は、常にYES/NOの間で反転するBOOLです。変更ディクショナリから得られるもののほとんどはkind=1です。とにかく、実際の変更値が何であるかを確認するために、観察しているオブジェクトをプローブせずにありますか?

ありがとう。

4

2 に答える 2

23

まず、NSKeyValueObservingOptionNewを指定します。

[theObject addObserver: self
            forKeyPath: @"theKey"
               options: NSKeyValueObservingOptionNew
               context: NULL];

…次に、オブザーバーメソッドで:

-(void) observeValueForKeyPath: (NSString *)keyPath ofObject: (id) object
                        change: (NSDictionary *) change context: (void *) context
{
    BOOL newValue = [[change objectForKey: NSKeyValueChangeNewKey] boolValue];
}

理想的には、呼び出す前に値がnil(​​まあ、それが起こるかもしれ-boolValueない)かどうかをチェックするでしょうが、ここでは明確にするために省略されています。

于 2009-05-11T21:42:24.373 に答える
21

Jim Doveyが言うように、変更ディクショナリはnilではなく、null値をもたらすことを除いて、

NSLog(@"%@", [change description]); 

結果は次のようになります。

{
    kind = 1;
    new = <null>;
    old = <null>;
}

前述のように、null値でboolValueを呼び出すと、エラーが発生します

[NSNull boolValue]:認識されないセレクターがインスタンス0xa0147020に送信されました

これを回避するには、次のように、nilではなく[NSNullnull]をチェックする必要があります。

if([change objectForKey:NSKeyValueChangeNewKey] != [NSNull null]) 
  BOOL newValue = [[change objectForKey: NSKeyValueChangeNewKey] boolValue];

また

id newValue;
if((newValue[change valueForKey: @"new"]) != [NSNull null]){
     BOOL newBOOL = [newValue boolValue];
}
于 2009-06-30T13:48:34.820 に答える