NSTreeControllerでNSOutlineView

NSOutlineViewをNSTreeControllerで弄る基本的なサンプルを探してみても見つからなかったので、一応メモ。

  1. NSTreeControllerのインスタンスを作る。
    • InspectorパネルのBindingを表示し、ツリーの内容をバインドする。
      • 単一の根のみを持たせる場合は、"contentObject"に根のアイテムのインスタンスをバインドさせる。
      • 複数の根を持たせる場合は、"contentArray"に根のアイテムを要素に持つ配列のインスタンスをバインドさせる。NSSetをバインドさせたければ、"contentSet"にバインドする。
    • Attributesを表示し、子アイテムに関する設定をする。
      • "Children key path"に、子アイテムの配列もしくはセットのパスを設定する。
      • "Count key path"に、子アイテムの個数(整数値が得られなければ当然ダメ、だと思う)のパスを設定する。
      • "Leaf key path"に、展開不可能か可かのBOOL値へのパスを設定する。YESを返すアイテムでは展開しない(isExpandableの逆)ので注意。
  2. NSOutlineViewを配置する。
    1. その内部のNSTableColumnについてのInspectorパネルのBindingを表示する。
    2. "value"の項について、NSTreeControllerにバインドし、表示したい内容のパスを設定する。
    3. これを各NSTableColumnについて行う

複数の異なるクラスで階層構造を作る場合は、各クラスに共通するプロトコルを実装させて、パスを共通にすればいい。DataSourceを使う場合と違って、NSTableColumnが渡されたりしないので、identifierで表示する内容を判別することはできないので。むしろif文を使わずに済むのがちょっとだけうれしい。

NSMenu/NSMenuItemなんかも階層構造にできるのだから、NSTreeControllerで弄れればいいのに、と思う。