我有一個NSTableView
顯示目錄的內容。我注意FSEvents,每次我得到一個事件我重新加載我的表視圖。 不幸的是,當前的選擇然後消失。有沒有辦法避免這種情況?reloadData在NSTableView,但保持當前選擇
回答
這取決於你如何填充你的NSTableView。
如果你有一個綁定到一個NSArrayController,又包含您的表視圖中顯示的項目表視圖,然後NSArrayController中有一個選項,以保留選擇。您可以從Interface Builder中選擇它(或不是)作爲NSArrayController的屬性。或者你可以在代碼中使用setPreservesSelection方法。
不過,如果你完全替代項目的數組NSArrayController的每一個你得到FSEvents時間管理,那麼也許選擇的保存不能工作。不幸的是,關於NSArrayController的這個屬性的Apple文檔對於何時可以並且不能保留選擇有些含糊。
如果你不使用一個NSArrayController,但也許用一個數據源來填充表視圖,那麼我認爲你必須自己管理的選擇。
那麼,你可以在調用reloadData之前保存選擇並在之後恢復。
NSInteger row = [self.tableView selectedRow];
[self.tableView reloadData];
[self.tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO];
這在某些情況下適用於我。但是,如果在選定行之前插入一些項目,則應該通過向其添加項目的計數來調整行變量。
@ silvansky答案的變體。
這一個沒有必要跟蹤插入/刪除項目的數量。它保持多種選擇。
想法是...
1.從當前選擇中創建一個選定對象/節點的數組。
2.刷新使用reloadData
3.在步驟1中獲得的每個對象的表,查找/記錄它的新指數
4.告訴表視圖/大綱視圖中選擇更新的索引設置
- (void)refresh {
// initialize some variables
NSIndexSet *selectedIndexes = [self.outlineView selectedRowIndexes];
NSMutableArray *selectedNodes = [NSMutableArray array];
NSMutableIndexSet *updatedSelectedIndex = [NSMutableIndexSet indexSet];
// 1. enumerate all selected indexes and record the nodes/objects
[selectedIndexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
[selectedNodes addObject:[self.outlineView itemAtRow:idx]];
}];
// 2. refresh the table which may add new objects/nodes
[self.outlineView reloadData];
// 3. for each node in step 1, find the new indexes
for (id selectedNode in selectedNodes) {
[updatedSelectedIndex addIndex:[self.outlineView rowForItem:selectedNode]];
}
// 4. tell the outline view to select the updated index set
[self.outlineView selectRowIndexes:updatedSelectedIndex byExtendingSelection:NO];
}
布拉德,你試過這個嗎? reloadData被延遲加載,所以你在調用之後不會有更新的數據。要在拖動/移動操作之後測試這個代碼,這會改變行的順序。我不認爲它會產生預期的結果。 – 2017-01-25 18:11:56
@SteveSheldon我記得這個工作,但不幸的是這個項目不再運行,所以我不能再測試了。 – 2017-03-03 15:28:16
@SteveSheldon,我認爲這有效;我使用了類似的技術;如果我記得,蘋果的文檔甚至提到這一點。你指的是哪些更新的數據?之後打電話? – Jerry 2017-05-02 07:13:02
在上reloadData()
使用數據源,蘋果文檔在頭文件的情況下是
所選行不保持。
爲了解決問題,您可以使用reloadDataForRowIndexes(rowIndexes: NSIndexSet, columnIndexes: NSIndexSet)
。正如在同一頭文件中提到的那樣
對於可見的單元格,將調用適當的dataSource和委託方法,並重繪單元格。
因此,數據將被重新加載,並且選擇也被保留。
[夫特3]
創建擴展並添加其保留選擇的方法。
extension NSTableView {
func reloadDataKeepingSelection() {
let selectedRowIndexes = self.selectedRowIndexes
self.reloadData()
self.selectRowIndexes(selectedRowIndexes, byExtendingSelection: true)
}
}
如果您使用傳統方式填充表視圖(而不是NSArrayController),請執行此操作。
小記事,這將選擇第一個和上一個選定的項目,如果您只想要先前選擇的項目,將「byExtendingSelection」設置爲false – 2017-01-12 21:59:29
- 1. 如何在nstableview reloaddata之後保持可見內容?
- 2. NSTableView沒有選擇突出顯示,但保持跟蹤選擇哪一行
- 3. 移動選擇菜單保持當前的URL選擇選項
- 4. NSTableView reloadData外部類
- 5. 如何更新選擇的選項,但保持先前選擇的選項?
- 6. jvectormap如何在選擇區域時保持當前顏色?
- 7. NSTableView reloadData泄漏內存
- 8. 保持選擇
- 9. 保持SUM但限制選擇
- 10. NSTableView的舊選擇
- 11. 保持選擇持久
- 12. 保持當前月份
- 13. 保持當前片段
- 14. 選擇後保持焦點選擇2
- 15. PHP:選擇當前選項
- 16. UiTableView後保持選定的部分/行reloadData
- 17. 滾動NSTableView的選擇到
- 18. NSTableView - 禁用行選擇
- 19. NSTableView的多重選擇
- 20. NSTableView的選擇和亮點
- 21. Silverlight的tabcontrol,如何保持當前選定的選項卡
- 22. 保持圖像選擇
- 23. Laravel保持選擇的值
- 24. 無法選擇當前選擇的div
- 25. 變化Selectize選擇,但保留先前選定值
- 26. 創建具有當後叫,保持選項卡中選擇
- 27. 如何使用ddaccordian.init保持當前類別選項卡保持打開狀態?
- 28. Extjs保持組合中的當前選擇項並添加新項目
- 29. 無法獲取的DatePicker選擇當前日期(ANDROID),保持上月啓用
- 30. 需要popviewcontroller,但保持當前視圖隱藏
感謝您的解釋。我真的想用一個NSArrayController – 2011-06-09 05:59:19
我發現setPreservesSelection是非常不可靠的。有時它起作用,有時它不起作用。 – 2012-09-11 15:34:02