InterfaceBuilderでNSTreeControllerのアトリビュートを表示すると
こうなっていて、実際にはこの「Children Key Path」をうそでもいいから入力しないと、ビルドには成功しても実行時にデバッグコンソールでエラーが出続ける。
で、ここでChildrenとかのKeyPathを入れるということは、Contentに子ノードを表現するArrayなり、Arrayを返すメソッドがあれば自動的にTree表示してくれそうな感じがする。Childrenの他に入力するKeyPathは画像の通り「Count」と「IsLeaf」・・・ふーむ、これはつまり、EseでOutlineView用に使っているクラスを流用すれば、簡単に行けるのでは?
と見当をつけてさっそく作業をしてみる。
EseのOutlineViewで使っているノード用のクラスはデベロッパドキュメントに載っていたFileSystem.mほぼそのまま。若干現在の実験プロジェクト用に書き換えて、さらにbindingも変えた。
「Model Key Path」に「representedObject」を入れるとNSTreeNodeが保持するObjectのKeyPathが要求されるようなので、ここはrepresentedObjectを削除して直接FileSystemクラスのKeyPathを指定した。
そうすると、とりあえずこれだけのコードで
-(void)awakeFromNib{ NSArray *mountedVols = [[NSWorkspace sharedWorkspace] mountedLocalVolumePaths]; NSMutableArray *roots=[NSMutableArray array]; if ([mountedVols count] > 0) { for (NSString *element in mountedVols){ NSLog(@"%@",element); FileSystemItem* item,*parent; if([element isEqualToString:@"/"]){ item=[[FileSystemItem alloc] initWithPath:element parent:nil]; } else{ parent=[[FileSystemItem alloc]initWithPath:[element stringByDeletingLastPathComponent] parent:nil]; item=[[FileSystemItem alloc] initWithPath:element parent:parent]; } [roots addObject:item]; [item release]; } [treeController setContent:roots]; } }(parentをreleaseしてないの点は現在のところ無視(^^;))
こうなった。
ふむふむ、あとはOutlineViewではディレクトリ名しか必要としないから全部NSStringでPath名を取得しているところを、NSURLに入れ替えるかどうか、というあたりだな。removableなメディアのマウントについてはNotificationがあるので簡単だろうし。
0 件のコメント:
コメントを投稿