2011-01-22 10 views
7

内のオブジェクトの観察のキー値を実装するためにどのように私は、オブジェクトの複雑な階層にKVOを理解しようといくつかの助けを必要としています。シナリオを設定しましょう。 MyClassオブジェクトには、MyPersonオブジェクトを含む変更可能な配列プロパティがあります。私はMyClassのmyPeopleプロパティの変更を観察したい。さらに、MyPersonオブジェクトに含まれるすべてのプロパティも監視したいと考えています。ここにクラス定義があります。ここでNSMutableArrayの

@interface MyClass:NSObject 
{ 
    NSMutableArray *myPeople; 
} 

@property(nonatomic, retain)NSMutableArray *myArray; 

@end 

がMyPersonオブジェクトである、

@interface MyPerson:NSObject 
{ 
    NSString *myName; 
    NSString *myLastName; 
} 

@property(nonatomic, retain)NSString *myName; 
@property(nonatomic, retain)NSString *myLastName; 

@end 

は、私は次のように興味の性質を観察することが正しいですか?

MyClass *myClass = [[MyClass alloc] init]; //myPeople is filled with myPerson objects 

MySchool *mySchool = [[MySchool alloc] init]; 

[myClass addObserver:mySchool 
     forKeyPath:@"myPeople" 
      options:NSKeyValueObservingOptionNew 
     context:NULL]; 

[myClass addObserver:mySchool 
     forKeyPath:@"myPeople.myName" 
      options:NSKeyValueObservingOptionNew 
     context:NULL]; //I am unsure about this one 

[myClass addObserver:mySchool 
     forKeyPath:@"myPeople.myLastName" 
      options:NSKeyValueObservingOptionNew 
     context:NULL]; //I am unsure about this one 

答えて

7

いいえ、正しくありません。配列に個別に追加するオブジェクトのプロパティを監視する必要があります。オブジェクトが配列に追加されたり、配列から削除されたりするときはいつでも、追加/削除されたオブジェクトにオブザーバを追加/削除する必要があります。

+0

クイック返信ありがとうございます。配列内のオブジェクトが辞書(NSDictionary)の場合はどうなりますか?その方法は使えますか? – David

+0

それは何も変わらないでしょう。配列オブザーバにNSKeyValueChangeInsertion'、 'NSKeyValueChangeRemoval'、またはNSKeyValueChangeReplacement'を指定して、配列自体の変更を通知することはできますが、配列の内容の変更を自動的に通知する方法はありません。 –

+0

ありがとう、私は今理解しています。 – David