2012-05-07 53 views
3

我正在嘗試使用NSTreeController和綁定將基於視圖的NSOutlineView連接到我的模型。NSOutlineView沒有更新

我的模型由一個主要的Node類(及其子類)組成。每個節點可以有0個或更多的孩子。出於性能原因,我將這些孩子存儲在一個C數組(Node對象)中。我定義我NSTreeController的childrenKeyPathcountKeyPathleafKeyPath性質,在我的節點類中實現它們:

- (NSArray *)childNodes { 
return [NSArray arrayWithObjects:children_ count:childCount_]; 
} 

- (BOOL)nodeIsLeaf { 
    return childCount_ < 1; 
} 

- (NSUInteger)childCount { 
    return childCount_; 
} 

當我添加一個新的孩子,我打電話[self willChangeValueForKey:@"childNodes"][self didChangeValueForKey:@"childNodes"]將其插入C數組後。

我按照文檔中所述設置了綁定。 (我綁定的NSTreeController的內容對象,以我的根節點。我綁定的NSOutlineView到NSTreeController的arrangedObjects的內容。我也約束的NSTextField到NSTableViewCell的objectValue.name屬性)

初始配置(根對象和它的孩子)運行應用程序時加載罰款。我也可以將新的子項添加到根對象。

但是,當我試圖添加一個新的孩子到任何節點(根目錄)還沒有孩子(沒有公佈三角形)NSOutlineView不更新(仍然沒有三角形)。新節點被正確地插入到模型中併發送了will/didChangeValue消息,但NSTreeController不會檢查新的子數組。在這種情況下,記錄上面的3個keyPath函數不會打印任何內容。

如果我關閉父級並再次展開它,那麼將重新加載節點,顯示三角形,並且我可以展開節點以查看剛剛添加的新節點。爲什麼NSTreeController不檢查更改,即使我在更改children數組時發送了KVO消息?

+0

據我所知,這是基於視圖的NSOutlineView中的一個錯誤。位於該位置的NSTableRowView缺少它需要的按鈕子視圖。當摺疊並將父級重新展開到有問題的行時,大綱視圖會重新創建行視圖並正確添加缺少的按鈕。需要的是以編程方式強制大綱視圖重新創建該行視圖而不必進行任何其他視覺更改的解決方法。 –

回答

0

好了,這將做到這一點:

/* item is the item which has just had new children added */ 
[_outlineView reloadItem:[_outlineView parentForItem:item] reloadChildren:YES]; 

這可能是低效的,它甚至可能固定在山獅,但是這對我的作品。你可以限制你需要這樣做的時間,當從0 - > 1孩子的時候(反之亦然?)。