你會在這裏做什麼是寫一個自定義的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
的 - 看到關於如何做修改的文檔。
不敢相信我以前沒有考慮過這種方法。一個更正:'-arrangedObjects'不返回'NSTreeNode'類的對象,而是一個處理'-childNodes'和'-descendantNodeAtIndexPath:'消息的對象。另外,重寫'-rearrangeObjects'並在那裏做你的工作可能會更好。 – 2010-11-15 14:14:35
謝謝,這似乎是朝着正確方向邁出的一步。但是NSTreeController是非常不透明的,正如Mike所寫,只會返回不是從NSTreeNode派生的bizarro _NSTreeProxy對象。這意味着我不能使用mutableChildNodes,所以我仍在研究這個。 – 2010-11-16 11:15:47
好的。然後,只需使用'-childNodes'方法獲取節點,創建一個單獨的'NSTreeNode'並返回該節點! (我會在一秒鐘內調整答案) – 2010-11-16 20:23:50