2010-11-11 48 views
1

在我的應用程序中,我有一個NSOutlineViewNSTreeController獲取其數據 - 這反過來從核心數據模型中獲取它。NSOutlineView - 合併多個來源

我現在想要做的是在大綱視圖中添加組標題和一些額外的行,顯然這些東西應該存在於模型之外併成爲視圖的一部分。但是,儘管我對此略過了一些想法,但我無法想出任何方式讓大綱視圖在不修改底層模型的情況下顯示這些內容,這顯然是一個很大的禁忌。

您的幫助非常感謝。我覺得我缺少一些明顯的東西在這裏...

回答

4

你會在這裏做什麼是寫一個自定義的NSTreeController子類。這就是爲什麼這是你想要做的改變的理想場所:

  • 它不在模型中,就像你說的那樣。
  • 與視圖無關 - 完全透明。
  • 基本上你想要的是從保存的數據中創建顯示的數據< - 這是一個控制器的任務。

幸運的是,Cocoa中的Controller類非常強大而且非常簡單。對你來說,應該足以覆蓋-arrangedObjects方法。重新使用默認實現,因爲它會執行很多有用的操作,如應用謂詞或排序。以下是這可能是這樣的:

- (id)arrangedObjects { 
    id root = [super arrangedObjects]; 

    // "root" is something like a NSTreeNode but not quite yet 
    NSTreeNode *newRoot = [NSTreeNode treeNodeWithRepresentedObject: nil]; 
    [[newRoot mutableChildNodes] setArray: [root childNodes]]; 

    // Do your customizations here 

    return newRoot; 
} 

返回的對象是類NSTreeNode的 - 看到關於如何做修改的文檔。

+0

不敢相信我以前沒有考慮過這種方法。一個更正:'-arrangedObjects'不返回'NSTreeNode'類的對象,而是一個處理'-childNodes'和'-descendantNodeAtIndexPath:'消息的對象。另外,重寫'-rearrangeObjects'並在那裏做你的工作可能會更好。 – 2010-11-15 14:14:35

+0

謝謝,這似乎是朝着正確方向邁出的一步。但是NSTreeController是非常不透明的,正如Mike所寫,只會返回不是從NSTreeNode派生的bizarro _NSTreeProxy對象。這意味着我不能使用mutableChildNodes,所以我仍在研究這個。 – 2010-11-16 11:15:47

+0

好的。然後,只需使用'-childNodes'方法獲取節點,創建一個單獨的'NSTreeNode'並返回該節點! (我會在一秒鐘內調整答案) – 2010-11-16 20:23:50