2

iOSアプリをMacに移植していて、エンティティの階層を管理するためにNSTreeControllerをセットアップしたいと考えています。この階層には、グループとアイテムの2つの異なるNSManagedObjectタイプがあり、1対多の関係(1つのグループから多くのアイテム)があります。ただし、NSTreeControllerの設定に問題があります。エラーメッセージが表示されます:

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

NSTreeControllerは、子がそれ自体を参照する1つのタイプのNSManagedObjectでセットアップすることを目的としているようであり、子を別の種類のオブジェクトにすることは機能しません。これは正しいです?もしそうなら、軽量の移行を使用して新しいデータモデルを古いデータモデルから適切に移行できるようにしながら、これを修正するために何をする必要がありますか?2種類のNSManagedObjectsを使用してNSTreeObjectを実際に実行できる場合、どのように設定すればよいですか?

4

1 に答える 1

2

NSTreeController で使用されるすべてのエンティティは、によって設定された指定された子メッセージに応答する必要がありますsetChildrenKeyPath:。この場合、それは になりますitemsitemsつまり、オブジェクトが子を持たない場合でも、ツリー構造内のすべてのオブジェクトはメッセージに応答する必要があります。

たとえば、ファイルシステムをモデル化し、NSTreeController で表示したいとします。次のようなデータモデルが必要です。

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

Folder:FileSystemObject{
}

File::FileSystemObject{
}

次に、提供するカスタム メソッドをオーバーライドしてFileSystemObject、子の数を返します。で NSTreeController にメソッド名を指定しsetCountKeyPath:ます。in のメソッドをオーバーライドしFolderて実際の子の数を返し、 in をオーバーライドしFileて 0 を返します。

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

誰かが、子のキーパスに応答しないオブジェクトはすべてリーフであると自動的に想定し、自動的に子の数をゼロにする代替ツリー コントローラーを作成しました。残念ながら、今は見つけられず、名前も覚えていません。

于 2011-06-27T15:32:04.743 に答える