-1

このドキュメントでは、Apple は、To-One および To-Many プロパティのアクセサ パターンについて説明しています。To-Many プロパティは、インデックス付きコレクションと順序付けされていないコレクションをカバーします。

これは私に質問をもたらします:
ツリー構造には異なるアクセサーパターンがありますか?それとも他のタイプのコレクションと同じように使用 (または適応) する必要がありますか?

どうやら、モデルに Indexed To-Many アクセサーを実装してブレークポイントを設定してもNSArray、ツリー構造の保持がNSTreeController. 要素の追加/削除、順序の変更など、モデルは正しく更新されますが、アクセサーの実装は呼び出されません。

ここで何か不足していますか?

4

1 に答える 1

1

ツリーは、配列と同じように 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」を子キー パスとして使用するように構成されている場合、そのノードの従業員を問題なく操作できます。それらのアクセサメソッドではない場合、何を使用できますか?

念のため、必ずすべてのカスタム クラスで+accessInstanceVariablesDirectlyreturn を実装してください。NOこれにより、メソッド/プロパティ名のスペルミスなどをキャッチできます。

于 2015-05-13T22:41:06.897 に答える