0

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 を正しくフラット化する方法についての提案は大歓迎です。

ありがとう!乾杯、トロンド

4

2 に答える 2

1

この質問は本当のタンブルウィード (1 か月で 2 回目) であることが判明したので、さらに情報を追加したいと思いました。より良いオプションを見つけることができなかったため、NSOutlineView を平坦化するために上記の投稿されたコードを使用することになりました。不明な数のサブフォルダーを再帰的に反復する必要がある場合 (私の場合)、これはdescendants、より深いレベルに到達するたびにメソッドが呼び出される最良のオプションのようです。ここで、私がとったのと同じアプローチを使用する、多くの便利な NSTreeController 拡張機能を備えた非常に便利な Web サイトを見つけました。誰かが NSTreeController の配列オブジェクトをフラット化するためのより高速で優れたアルゴリズムを見つけ出すのを手伝ってくれない限り、私はこのアプローチに固執すると信じています。

乾杯、トロンド

更新:ソリューションに関する質問の後、アウトラインビューを平坦化する方法を投稿することにしました。彼が他の人を助けることができることを願っています。

- (void) flattenOutlineview
{
    NSMutableArray *nodeArray = [NSMutableArray array];
    [self.myFlattenedFiles removeAllObjects];
    [self.myFlattenedNodes removeAllObjects];
    [self.myIndexDict removeAllObjects];
    [nodeArray removeAllObjects];

    for (SDNode *rootnode in self.rootNodes)
    {
        [nodeArray addObject:rootnode];

        [self.myIndexDict setObject:[rootnode indexPath]
                             forKey:[[[rootnode representedObject] representedObject] fullpathL]];

        for (SDNode *node in [rootnode childNodes])
        {
            if (node.isLeaf){
                [nodeArray addObject:node];
                 [self.myIndexDict setObject:[node indexPath]
                                 forKey:[[[node representedObject] representedObject] fullPathCopy]];
            }
            else {
                [nodeArray addObjectsFromArray:[self descendants:node]];
                [self descendantsIndex:node];
           }  
       }  
   }
   [self.myFlattenedNodes setArray:[nodeArray copy]];

   for (SDNode *node in self.myFlattenedNodes)
   {
       [self.myFlattenedFiles addObject:[[node representedObject] representedObject]];
   }
}
于 2012-11-26T04:13:11.017 に答える
0

これは、私が書いた別の回答からリンクされているのを見ました。ツリー内のすべてが展開/表示されている場合、これは機能します。

for (NSUInteger row = 0; row < [outlineView numberOfRows]; row++)
{
    NSTreeNode* node = [outlineView itemAtRow:row];
    [nodeArray addObject:node];
}

OutlineView の行は、基本的に平坦化されたツリーです。そして、すべてのアイテムを取得するために反復しながら、すべてのアイテムを展開することができます。

于 2015-07-15T06:15:53.633 に答える