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

なお、キャストなどは省略した。上記のコードはコピペでは動かない。