NSTreeControllerで使用するObjectの変換についてのメモ
NSTreeControllerでnodeを示すのに使用されるObject
- NSTreeNode
- NSTreeControllerで木構造のノードを管理しやすくするためのクラス。このクラスのインスタンスから、自分自身のNSIndexPathや、NSManagedObjectへの参照を得ることができる。 親ノード、小ノードを手繰ることが出来る。
- NSIndexPath
- ノードの位置を数字の列で指定するクラス。各ノードは、親のオブジェクトのNSArrayに入っている。 この、NSArrayのindexの値を複数持つことで、fileSystemのパスのように目的のノードの位置を指定することができる。 2/22追記:選択範囲を”状態の保存”で保存する場合は、このindexPathを使用するのが望ましい。NSTreeNodeやNSManagedObjectは保存ファイルやポインターに依存しているので、識別子の変換作業が追加で必要になる。
- NSManagedObject
- NSTreeControllerが参照するモデルとしてCoraDateを使用する場合に、ノードのデータ本体としてこのクラスのサブクラスが使用される。NSTreeNodeのrepresentedObjectに設定される。
- row
- NSTreeControllerがNSTableViewやNSOutlineViewに結び付けられている時に、表示中の0から始まる行番号を示す。表示上の値であるため、兄弟ノードの子ノードが表示の為に開閉されると、子ノード分増減する。
上記のObjectの相互変換
NSTreeNodeから各種Objectへの変換
もっとも簡単に変換できる。気をつけることは、rowはviewにしか存在しない概念なので、NSOutlineViewで変換するしかないことぐらい。
型 | 方法 |
---|---|
NSIndexPath | NSTreeNode.indexPath |
NSManagedObject | NSTreeNode.representedObject |
row | [NSOutlineView rowForItem:NSTreeNode] |
NSIndexPathから各種Objectへの変換
一度NSTreeNodeに変換してからそれぞれの型に変換する。
型 | 方法 |
---|---|
NSTreeNode | [NSTreeController.arrangedObjects descendantNodeAtIndexPath:NSIndexPath] |
NSManagedObject | [NSTreeController.arrangedObjects descendantNodeAtIndexPath:NSIndexPath].representedObject |
row | [NSOutlineView rowForItem:[NSTreeController.arrangedObjects descendantNodeAtIndexPath:NSIndexPath]] |
NSManagedObjectから各種Objectへの変換
NSTreeController.arrangedObjectsを使って、総なめする以外には方法はない。
コーディングするときは、NSManagedObjectは中間表現としては使ってはならない。NSIndexPathかNSTreeNodeを使用すること。
rowから各種Objectへの変換
rowはviewにしか存在しない概念なので、NSOutlineViewでNSTreeNodeへ変換する。 その後、それぞれの型に変換する。
型 | 方法 |
---|---|
NSIndexPath | [NSOutlineView itemAtRow:row].indexPath |
NSTreeNode | [NSOutlineView itemAtRow:row] |
NSManagedObject | [NSOutlineView itemAtRow:row].representedObject |
なお、キャストなどは省略した。上記のコードはコピペでは動かない。