2

独自のバインド可能なカスタム ツリービューを作成しています。そのために、アイテムの対多関係の更新について NSTreeController を観察したいと思います。NSTreeController は CD 管理オブジェクト コンテキストにバインドされます。すべての深度レベルには、親/子/isLeaf プロパティを持つ独自の CD エンティティがあります。ビュー(およびアイテムの子の順序)で同じ階層を維持する必要があります。何かが挿入されると、その children プロパティの監視を開始します。もちろん、新しく挿入されたオブジェクトのインデックスパスを知る必要があります。

何が挿入/削除されたかを正確に知りたいので、その子への挿入/削除を監視し始めることができます。私が理解しているように、これを行う標準的な方法は、observeValue:forKey... 内の「変更」NSDictionary を調べることですが、変更は NULL です。

これは長年のバグであることは知っていますが、良い回避策はありますか? いくつかの例のビューが配列を保存し、モデルが変更されたときに違いを比較するのを見てきました。ツリービューの場合はより複雑です。また、この方法ではメモリと CPU サイクルが無駄になります。私がテストしている回避策が 1 つあります。それはちょっとうまくいくので、まだ説明しません。

4

1 に答える 1

1

NSTreeController をサブクラス化し、その挿入/削除メソッドを実装するのはどうですか。たとえば、このようなもの。

- (void)insertObject:(id)object atArrangedObjectIndexPath:(NSIndexPath *)indexPath {

      // ... code to update your object relationships .. 
      // ... Take care here if you update any variables in your model (eg a sortindex) that would trigger KVO in the NSTreeController.  In those case you need to make the updates without triggering KVO by using setPrimitiveValue:forKey or get an infinite loop

      [super insertObject:object atArrangedObjectIndexPath:indexPath];

}
于 2009-08-27T13:03:15.073 に答える