2

私は自分のiOSアプリケーションをMacに移植しており、NSTreeControllerを設定してエンティティの階層を管理したいと考えています。この階層には、1対多の関係(1つのグループから複数のアイテム)を持つ2つの異なるNSManagedObject型、GroupおよびItemがあります。しかし、私はNSTreeControllerの設定に問題があります。私は、エラーメッセージが出てい:2つの異なるコアデータを持つNSTreeController NSManagedObjectエンティティ

[<NSManagedObject 0x10029c410> valueForUndefinedKey:]: the entity Item is not key value coding-compliant for the key "items". 

NSTreeControllerはNSManagedObjectのタイプで設定されることを意図しているようだ、その子供自体を参照し、子供を持つことは別の種類であることオブジェクトの動作しません。これは正しいです?新しいデータモデルを軽量移行を使用して古いデータモデルから適切に移行できるようにしながら、これを修正するためには何をする必要がありますか? NSTreeObjectを2つの異なる種類のNSManagedObjectsで実現することができたら、どうすれば設定できますか?

答えて

2

NSTreeControllerで使用されるすべてのエンティティは、setChildrenKeyPath:で設定された指定された子メッセージに応答する必要があります。この場合はitemsとなります。言い換えれば、ツリー構造内のすべてのオブジェクトは、たとえそのオブジェクトが決して子を持たなくてもitemsメッセージに応答しなければならない。

などのメッセージ。ファイルシステムをモデル化し、それをNSTreeControllerで表示したいとします。あなたはこのように見えたデータモデルを持っている必要があります:

FileSystemObject{ 
    name: 
    parent<<-->FileSystemObject.children 
    children<-->>FileSystemObject.parent 
} 

Folder:FileSystemObject{ 
} 

File::FileSystemObject{ 
} 

その後、あなたは子供の数を返しますFileSystemObjectためのカスタムメソッドを提供オーバーライドします。 NSTreeControllerにメソッド名をsetCountKeyPath:で指定します。 Folderのメソッドをオーバーライドして、子の実際の数を返し、Fileにオーバーライドしてゼロを返します。

これはNSTreeControllerがよく考えられていない理由です。他のコントローラとは異なり、UIのニーズを満たすようにデータモデルを変更することによってカプセル化が中断されますが、これは非常に貧弱な方法です。

誰かが、子keypathに応答しないオブジェクトがリーフであり、ゼロの自動子カウントを提供すると自動的に仮定している代替ツリーコントローラを作成しました。残念ながら、私は今はそれを見つけることができず、それが何と呼ばれたのか覚えていません。