2012-08-05 46 views
0

我有一個綁定到我的NSTreeController的NSOutlineView。 NSTreecontroller(myTreeController)的內容使用以下命令設置數據: [self.myTreeController setContent:self.myArrayOfFiles]; 該數組的內容由使用NSTreeNode子類(TKnode)添加的NSTreeNode父對象和子對象組成:如何有效地扁平一個NSOutlineView?

[TKnode treeNodeWithRepresentedObject:myRootObject]

這工作得很好,並正確顯示我的NSoutlineView。但是當我想遍歷NSOutlineView的內容時,我需要將它平坦化並將對象存儲在一個數組中。這是我需要一些幫助的地方,因爲我擁有的解決方案不是最佳的,並且可能會出現錯誤。

我首先使用返回NSTreeController的內容:

- (NSArray *)rootNodes; 
{ 
    return [[myTreeController arrangedObjects] childNodes] ; 
} 

這將返回一個大小保持所述樹結構的數組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 
} 

這工作,並返回一個包含所有我的對象,而不是NSTreeNodes的數組,但我感興趣的對象但似乎很容易出錯,我必須有時兩次在對象上調用RepresentObject來訪問我的對象。這是我應該如何使用NSTReeController和NSTreeNodes?有沒有更好的辦法?我想首先使用NSTreeNode和NSTreeController的原因是爲了獲得一些已經實現的免費方法,例如排序和排列的對象,我習慣使用NSTableView。但是我用來訪問NSTreeController內容的方法似乎不正確?我應該使用arrangedObjects來獲取NSTReeController的內容,還是應該使用其他方法?任何有關如何正確壓扁NSOutlineView的建議,我都非常感謝。

謝謝!乾杯,特龍

回答

1

這個問題原來是一個真正的風滾草(我的第二個月),所以我想跟進一些信息。我結束了使用上面張貼的代碼扁平化我的NSOutlineView,因爲我無法找到更好的選擇。當你不得不迭代遍歷未知數量的子文件夾時(在我的情況下),這似乎是每當你達到更深層次時調用descendants方法的最佳選擇。我發現了一個非常有用的網站,其中包含許多有用的NSTreeController擴展here,它使用與我一樣的方法。除非有人幫助我找出一個更快更好的算法來壓扁NSTreeController的佈局對象,我相信我會堅持這種方法。

乾杯,特龍

更新:的解決方案,我決定後我如何扁平化的outlineview方法的問題後。我希望他能幫助別人。

- (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]]; 
    } 
} 
+0

你可以發送treeController演示代碼。因爲我們堅持在這裏。我們正在解析目錄,需要以樹形視圖顯示。示例應用 謝謝。 – KethanKumar 2013-12-13 09:31:01

+0

@ user2553442:請參閱我更新的答案。希望這可以幫助。 T – 2013-12-16 22:30:40

+0

你有這個NSOutlineView的示例代碼.. @Trond Kristiansen – KethanKumar 2013-12-17 03:46:04

0

看到這個鏈接從我剛剛寫的另一個答案。只要你有在擴展樹的一切/顯示這會工作:

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

的outlineView的行基本上是扁平的樹。你也許可以在迭代所有項目的同時擴展每個項目。