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 件のコメント:
コメントを投稿