ツリーは、配列と同じように 1 つのデータ構造ではありません。単一のルート ノード (プロパティがそのノードとの対 1 関係である場合)、または最上位ノードの配列 (プロパティがそれらのノードとの対多関係である場合) から開始します。ツリーの他のレベルは、ルート ノードを提供するオブジェクトからではなく、それらのルート ノードとは別の関係です。
NSTreeController
子キー パスで構成されます。各ノードでそのキー パスを使用して、各ノードの子にアクセスします。ノードを追加または削除する場合、それは KVC を介した親ノードの子の突然変異になります。(おそらく-mutableArrayValueForKeyPath:
、親で使用しNSMutableArray
、結果のプロキシでメソッドを使用します。) 親オブジェクトのインデックス コレクション ミューテーション アクセサーを通過する必要があります。
アクセサーを正しいクラスに実装した (そしてそれらにブレークポイントを設定した) ことは確かですか?
フレームワークには、KVC を使用してプロパティにアクセスして変更する以外に選択肢はありません。KVC は、アクセサー メソッドがプロパティ名である場合にそれを使用します。クラスの実装方法によっては、KVC はアクセサ メソッドを呼び出す以外に選択肢がない場合があります。たとえば、配列型のゲッターやセッター、またはそれを裏付ける配列インスタンス変数なしで、インデックス付きコレクション プロパティを実装できます (または、プロパティ名とはまったく関係のない名前のインスタンス変数を持つこともできます)。
たとえば、クラスは次を実装できます。
- (NSUInteger) countOfEmployess;
- (id) objectInEmployeesAtIndex:(NSUInteger)index;
- (void)insertObject:(id)anObject inEmployeesAtIndex:(NSUInteger)index;
- (void)removeObjectFromEmployeesAtIndex:(NSUInteger)index;
-employees
または-setEmployees:
アクセサもemployees
インスタンス_employees
変数もありません。「employees」という名前のインデックス付きコレクション プロパティについては、依然として完全に KVC に準拠しています。そのNSTreeController
ようなノードが与えられ、「employees」を子キー パスとして使用するように構成されている場合、そのノードの従業員を問題なく操作できます。それらのアクセサメソッドではない場合、何を使用できますか?
念のため、必ずすべてのカスタム クラスで+accessInstanceVariablesDirectly
return を実装してください。NO
これにより、メソッド/プロパティ名のスペルミスなどをキャッチできます。