2013-10-05 63 views
1

我有一個使用NSTreeController的大綱視圖,大多數情況下,一切正常,因爲我想,除了添加新項目時,我想自動選擇要編輯的項目。在過去使用NSTableView的時候我會確定的項目所在的行,使用功能如何編輯NSOutlineView項目

- (void)editColumn:(NSInteger)columnIndex row:(NSInteger)rowIndex withEvent:(NSEvent *)theEvent select:(BOOL)flag 

然而,由於NSOutlineView使用NSindexPath,我與如何實現這個 掙扎,所以有一個函數可以傳遞一個NSIndexpath而不是一行來獲得相同的結果。或者我應該對NSOutlineView有不同的方法。

+0

你設置列在Interface Builder編輯?? –

+0

是的,我可以雙擊並編輯任何項目,這不是問題。我需要的是一種以編程方式啓動的方式。 – Cory

+0

你有沒有試過這種方法('editColumn:row:withEvent:select:'就是)從過去的經驗看,似乎已經爲我工作。 – Joshua

回答

1

原來我的問題與addChild方法有關,addChild的文檔顯示如下;

特殊注意事項

與OS X v10.4的開始本方法的結果被延遲 直到runloop的下一次迭代,使得錯誤 呈現機制可以提供反饋作爲片材。

所以,我添加了以下,與相應的選擇

[self performSelector:@selector(editNewSector:) withObject:nil afterDelay:0]; 

一切似乎是現在的工作,我的代碼如下

- (IBAction)addChildSector:(id)sender 
{ 
    [[self myTreeController] addChild:sender]; 
    [self performSelector:@selector(editNewSector:) withObject:nil afterDelay:0]; 
} 

- (IBAction)editNewSector:(id)sender 
{ 
    NSTreeNode *nodeSector = [[self myOutlineView] 
            itemAtRow:[[self myOutlineView] selectedRow]]; 

    NSInteger row = [[self myOutlineView] rowForItem:nodeSector]; 
    [[self myOutlineView] editColumn:0 row:row withEvent:nil select:YES]; 
} 
+1

如果樹控制器的'chooseInsertedObjects'爲'NO',則可能會失敗。不過,我不知道有更好的方式來獲得新增加的物品。 –

+0

我做到了。它的工作正常,但我需要如何設置默認名稱,如「untitle文件夾」。你能幫助我嗎? – akk

2

你應該能夠只是調用editColumn:row:withEvent:select:在NSOutlineView:

[outlineView editColumn:0 row:editRowIndex withEvent:nil select:YES]; 

雖然這從NSTableView的方法,NSOutlineViewNSTableView一個子類,因此你也能調用它的大綱視圖。

+2

你可以使用'rowForItem:'獲得行索引。 –

+0

@PeterHosey我添加了一個答案,它給出了預期的結果。但仍然懷疑這是否是最好的方法。 – Cory