NSTreeController にバインドされている NSOutlineView があります。NSTreecontroller (myTreeController) のコンテンツは、次のコマンドを使用してデータで設定されます: [self.myTreeController setContent:self.myArrayOfFiles]; 配列の内容は、NSTreeNode サブクラス (TKnode) を使用して追加された NSTreeNode 親オブジェクトと子オブジェクトで構成されます。
[TKnode treeNodeWithRepresentedObject:myRootObject]
.
これは非常にうまく機能し、私の NSoutlineView を正しく表示します。しかし、NSOutlineView のコンテンツを繰り返し処理したい場合は、それを平坦化し、オブジェクトを配列に格納する必要があります。これは、私が持っているソリューションが最適ではなく、エラーが発生しやすい可能性があるため、助けが必要な場合があります。
最初に、次を使用して NSTreeController のコンテンツを返します。
- (NSArray *)rootNodes;
{
return [[myTreeController arrangedObjects] childNodes] ;
}
これは、ツリー構造を保持するサイズ 1 の NSTreeControllerTreeNode 配列を返します。次に、childNodes メソッドを使用して、ツリー構造の最初のレイヤーにアクセスします。
- (NSArray *)flattenedNodes
{
NSMutableArray *mutableArray = [NSMutableArray array];
for (TKnode *rootnode in [self rootNodes]){
for (TKnode *node in [rootnode childNodes]){
if (![[node representedObject] isLeaf]){
[mutableArray addObjectsFromArray:[self descendants:[node representedObject]]];
}
else {
[mutableArray addObject:[[node representedObject] representedObject]];
}
}
}
DLog(@"My files: %lu",[mutableArray count]);
return [[mutableArray copy] autorelease];
}
子の子は、次のメソッドを使用して再帰的にアクセスされます。
- (NSArray *)descendants:(TKnode *) node
{
NSMutableArray *descendantsArray = [NSMutableArray array];
for (TKnode *mynode in [node childNodes]) {
[descendantsArray addObject:[mynode representedObject]];
if (!mynode.isLeaf){
[descendantsArray addObjectsFromArray:[self descendants:mynode]];
}
}
return [[descendantsArray copy] autorelease]; // return immutable
}
これは機能し、NSTreeNode ではなく、関心のあるオブジェクトを含むすべてのオブジェクトを含む配列を返します。これは、NSTReeController と NSTreeNodes を操作する方法ですか? より良い方法はありますか?私が最初に NSTreeNode と NSTreeController を使用したかった理由は、NSTableView で慣れ親しんだ sorting や ArrangeObjects など、既に実装されているメソッドの一部を無料で取得するためでした。しかし、NSTreeController コンテンツにアクセスするために使用する方法は正しくないようです。を使用しarrangedObjects
て NSTReeController のコンテンツを取得する必要がありますか、それとも別のアプローチを使用する必要がありますか? NSOutlineView を正しくフラット化する方法についての提案は大歓迎です。
ありがとう!乾杯、トロンド