2009-05-11 10 views
10

をイントロスペクト、ココアで観察:キー値は、私はboolean型プロパティにNSObjectのメソッドを観察し、キー値を使用してい変化特性

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

このキーパスの値の最も興味深い部分はどのBOOLですYES/NOの間で常に反転しています。私が変更辞書から出てきたものは、kind = 1です。実際の変更値が何であるかを観察しているオブジェクトを調べていないのですか?

ありがとうございました。

[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だったかどうかを確認したいあなたはNSKeyValueObservingOptionNewを指定まず

答えて

20

-boolValueと呼ぶ前に、それを明確にするために省略した。

+0

どのように "ゼロ" を得ることができますか?それはNSObject型の何かのために起こるかもしれませんが、私はそれがBOOLのためにどうなるか見ていませんか? – Adam

+0

「結果がない」と「いいえ」の結果が異なるため、 '[change objectForKey:NSKeyValueChangeNewKey]'の結果が 'nil'だったかどうかをチェックします。 –

+1

@JimDovey - BOOL以外のプロパティのデバッグコンソールで辞書を調べると、文字列のリテラルチェックも必須ではないのだろうか 'new =" " – pulkitsinghal

19

ジムDoveyは

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

のようなものになりますように変更辞書は、nilをもたらすが、NULL値いないことを除いて、言うように:BOOLVALUEを呼び出して、前述のように

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

null値でエラーが発生する

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

これを避けるために、人はそうのように、nilのためではなく、[nsnullをヌル]のためではありませんチェックする必要があります:

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]; 
} 
+0

私はこの記事を検索して見つけました。 new = nullが返されるという同じ問題があります。 http://stackoverflow.com/q/11835607/772481これは修正されましたか? – angelokh

+0

これは決して解決されないだろうか。あなたの質問では、事を複雑にする関係を観察することに問題が発生します。NSKeyValueChangeKindKeyエントリは、NSKeyValueChangeInsertion、NSKeyValueChangeRemoval、またはNSKeyValueChangeReplacementをそれぞれ返すことによって、関係のオブジェクトが挿入、削除、または置換されたかどうかを示します。 –

関連する問題