我有一個綁定到我的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的建議,我都非常感謝。
謝謝!乾杯,特龍
你可以發送treeController演示代碼。因爲我們堅持在這裏。我們正在解析目錄,需要以樹形視圖顯示。示例應用 謝謝。 – KethanKumar 2013-12-13 09:31:01
@ user2553442:請參閱我更新的答案。希望這可以幫助。 T – 2013-12-16 22:30:40
你有這個NSOutlineView的示例代碼.. @Trond Kristiansen – KethanKumar 2013-12-17 03:46:04