NSTreeNodeクラスの使い方

コードを読んでいて気がついたのですがNSTreeNodeも使われていますね。なんとなくNSTreeNodeは最初に見たBaseNodeクラスの代替になるクラスだと思っていましたがどうも違うようです。具体的にこのサンプルでいうと、selectParentFromSelectionメソッドで使用されています。選択されているノードの親ノードを選択するメソッドですがこの中で

NSTreeNode* firstSelectedNode = [[treeController selectedNodes] objectAtIndex:0];
NSTreeNode* parentNode = [firstSelectedNode parentNode];

のように使われています。注目すべきは、TreeControllerに対してselectedNodesメッセージを送信しているところ。昨日みたperformAddFolderメソッドの中で、選択されているノードがリーフノードだったら親ノードを選択するという処理

if ([[[treeController selectedObjects] objectAtIndex:0] isLeaf])
  {
    [self selectParentFromSelection];
  }

というのがあるのですが、ここではTreeControllerに対してselectedObjectsメッセージを送信しています。selectedNodesのドキュメントにはReturns an array of the receiver’s selected tree nodes.とあるのでこのメッセージがNSTreeNodeオブジェクトの配列をかえすと考えて良さそうです。実際、

id obj = [[treeController selectedObjects] objectAtIndex:0];
NSLog(@"%@",[obj class]);
obj = [[treeController selectedNodes] objectAtIndex:0];
NSLog(@"%@",[obj class]);

としてみると期待どおりのログが出力されます。つまり、アプリケーションの論理的な値(プロパティ値など)はselectedObjectsでBaseNodeクラスのオブジェクトを取得・ツリーの物理的状態(インデックスパスとか親ノードとか)を取得したいときはNSTreeNodeというように使い分けしているようです。NSTreeNodeはインタフェース用のオブジェクトなんですね。これが、正しい使い分けなのか確信するには至っていないのですが、正解とはいえないまでも間違いでもないでしょう。

v10.4までは、selectedObjectsしかなかったわけでアプリケーションが格納するノードオブジェクトでリーフ判定やインデックスパスの計算をする必要があったのでしょうがv10.5からはこのあたりの処理は実装しなくてもよくなるのかな?

この記事のトラックバックURL:

http://hippos-lab.com/blog/trackback/223

返信