2011-04-21 46 views
2

短篇小說:NSArrayController的選擇是重新

NSArrayController中的選擇正在每當setContent發出復位。我想知道是否有辦法解決這個問題。

當然,如果我讓NSArrayController使用它的內部selectionIndexes,這將是唯一可接受的行爲,因爲那樣它將無法跟蹤這兩者。然而,selectionIndexes也被重新連線,並且這部分順利完成。不過,它仍然覺得需要重置選擇。

更新:醜陋的黑客攻擊的解決方案

我搬到這一個答案。不過,我很高興看到另一個更有見地的答案。

詳細地說:

我有與被文件之間共享的檢查員面板(在文本編輯源代碼,附帶的xcode仿照)基於文檔的可可中的應用。在Document類中,我有一個NSMutableArray和一個NSMutableIndexSet,它們綁定到一個NSArrayController。

檢查器面板位於單獨的nib文件中,並且我有兩個相同的NSArrayController,一個來自主文檔窗口,另一個來自檢查器面板,因此兩者都可以與文檔進行交互。這就是爲什麼我要手動綁定到selectionIndexes,這樣我就不會用兩個單獨的NSArrayControllers獲得兩個單獨的選擇。

檢查員面板跟蹤哪些文件是由一個檢查:

Document *inspectedDocument; 

每當文件被切換時更新,或者沒有文檔具有在所有焦點。一個NSObjectController鏈接到inspectedDocument,我前面提到的NSArrayController被鏈接到該控制器。

現在,我的問題是,當檢查員面板到位,並且inspectedDocument被更改時,選擇索引被重置。如果我不使用檢查器面板,問題就會消失,所以我認爲它是發出此重置的NSArrayController。我沒有任何綁定到選擇並可以改變它的控件(比如表格視圖)。

在檢查器面板的NSArrayController中,如果我勾選了「避免空選擇」,則選擇將重置爲第一個對象,否則重置爲不選,所以這絕對是合法重置選擇。實際上,我甚至不希望檢查器面板能夠更改選擇,所以理想情況下,我想爲該NSArrayController的選擇索引建立一個只讀綁定。

+0

我很欣賞你的移動短版脫穎而出,但是這仍然是一個有點晦澀難懂。我現在已經讀過幾次了,聽起來好像你說你的數組控制器的選擇會在其內容發生變化時發生變化,而你不想這樣做,這根本沒有任何意義。如何在不同的內容中保留選擇? – 2011-04-22 03:56:29

+0

因爲選擇作爲NSMutableIndexSet存儲在Document類中。所以兩個文檔有不同的選擇索引,我希望在它們之間切換時保留它們。對於不清楚的問題感到抱歉,這是一個很難描述的問題,當我更瞭解它時,我會嘗試修改它。 – 2011-04-22 04:00:18

+0

明白了;我認爲可能是這樣,但這兩者之間的聯繫並不十分明確。這是一個有趣的問題。不用道歉;我只是想,如果你想再次修改,那麼對不清楚的內容發表評論可能會對你有所幫助。 – 2011-04-22 04:05:50

回答

1

我仍然不明白爲什麼會發生,或者如果它可以關閉,但我使用的解決方案非常簡單,我只保存選擇,然後重新連接NSArrayController,然後立即恢復它。

inspectedDocument改變這被稱爲並且選擇重置:

NSIndexSet *indexSet = nil; 
if (inspectedDocument != doc) { 
    indexSet = [doc.selectedIndexes copy]; // Backup selection 
} 

[self setValue:doc forKey:@"inspectedDocument"]; // Selection is reset here 

if (indexSet) { 
    // The following function basically does doc.selectedIndexes = indexSet; 
    [inspectedDocument selectObjectsAtIndices:indexSet]; // Restore selection 
    [indexSet release]; 
} 
相關問題