2010-04-13 72 views
5

首先我是新來的可可發展,所以我想我可能試圖做這種錯誤的方式,但這裏的負載數據雲:來擴展NSOutlineView的所有項目,從一個數據源

我有一個NSOutlineView,它加載NSOutlineViewDataSource實現的數據。我希望所有項目在被加載後都被擴展,但是當數據加載完成後,我似乎無法找到事件,因此我可以發送一個[outlineView expandItem: nil expandChildren: YES]

我查看了NSOutlineViewDelegate協議,但我無法找到適合此調用的地方。這個問題最好的辦法是什麼?

回答

1

下面是我通常如何處理這個問題。我喜歡自己展示我的主窗口,而不是讓它自動發生。這允許我在向用戶顯示窗口之前確保我所有的界面項目都是如何設置的。看來你也可以這樣做。所以首先我取消選中窗口界面生成器中的「啓動時可見」。然後在我的應用程序的委託類我用這個方法,它的NSApplication的deleate方法:

  • (無效)的applicationDidFinishLaunching:(NSNotification *)aNotification

在那裏設置我的界面項目,因爲在那點我知道一切都被加載。然後該方法的最後一行是:[myWindow makeKeyAndOrderFront:self] ;.這樣,您就知道您的窗戶在用戶看到窗戶之前是完美的。所以我會在那裏嘗試你的方法。

+0

謝謝,但對我來說這不是一個解決方案,因爲outlineview是在用戶單擊按鈕時打開的面板中,而且數據似乎在顯示面板時加載,而不是在應用程序稍後啓動 – matei 2010-04-14 05:55:53

1

我找到了答案。看來,實施委託方法-(void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item 將這樣的伎倆:


-(void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item 
{ 
    [outlineView expandItem:item]; 
} 
+0

時加載編輯:這不是一個好的答案,它似乎搞砸了outlineview中的最後一項,並不顯示它們,所以任何幫助,將不勝感激 – matei 2010-04-16 09:56:38

3

我想出了最好的解決辦法是寫一個零延遲之後擴展NSOutlineView的方法。

- (void)windowDidLoad 
{ 
    [super windowDidLoad]; 
    [self performSelector:@selector(expandSourceList) withObject:nil afterDelay:0.0]; 
} 

- (IBAction)expandSourceList 
{ 
    [mSourceListView expandItem:nil expandChildren:YES]; 
} 
+0

謝謝你建議使用'windowDidLoad':這似乎是一個好地方這種設置。但順便說一下,我發現我不需要使用延遲,至少對於我正在嘗試做的事情:我直接從'windowDidLoad'調用'-expandItem:',到目前爲止,這似乎工作。也許是由於以下原因之一:我在10.9.3;我只擴展了某些行,所以我提供了特定的項目給'-expandItem:'而不是'nil' ...? – Ashley 2014-06-27 17:11:21

6

通常我喜歡這樣做內部形式 - awakeFromNib或任何其他啓動回調

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.outlineView expandItem:root expandChildren:YES]; 
}); 

這將在當前週期中的runloop結束排隊的執行塊,從而,它將在全部初始化發生後執行。沒有必要設置任何人工延遲。

+0

不知道爲什麼這是downvoted。當我能找到其他解決方案失敗時,這對我有用。謝謝! – 2014-05-27 04:05:38

+0

最佳答案! :)這一個工程無論上下文。 – Kappe 2014-08-04 15:41:42