我有一个带有可选行的表格视图。当我重新加载表格视图时,可能会添加(或删除)一些新行,并且表格视图单元格中的一些标签可能会更改。这就是我想通过调用来实现的[tableView reloadData]
。
不幸的是,该方法还清除了表格视图的整个状态——包括选择。但我需要保留选择。
那么如何重新加载表格视图中的所有数据,同时仍然保持选定的行被选中?
我有一个带有可选行的表格视图。当我重新加载表格视图时,可能会添加(或删除)一些新行,并且表格视图单元格中的一些标签可能会更改。这就是我想通过调用来实现的[tableView reloadData]
。
不幸的是,该方法还清除了表格视图的整个状态——包括选择。但我需要保留选择。
那么如何重新加载表格视图中的所有数据,同时仍然保持选定的行被选中?
您可以使用以下方式存储所选行的索引路径:
rowToSelect = [yourTableView indexPathForSelectedRow];
在重新加载数据之前。并在重新加载使用后:
[yourTableView selectRowAtIndexPath:rowToSelect animated:YES scrollPosition:UITableViewScrollPositionNone];
JeroVallis 解决方案适用于单一选择表视图。根据他的想法,这就是我如何使它与多项选择一起工作:
NSArray *selectedIndexPaths = [self.tableView indexPathsForSelectedRows];
[tableView reloadData];
for (int i = 0; i < [selectedIndexPaths count]; i++) {
[tableView selectRowAtIndexPath:selectedIndexPaths[i] animated:NO scrollPosition:UITableViewScrollPositionNone];
}
最有效的方法是在数据模型中保持选中状态
isSelected
。cellForRowAt
根据属性设置单元格的选中状态。didSelectRow
切换isSelected
并仅重新加载给定索引路径处的特定行。具有一些优势的替代方法是仅重新加载尚未选择的行。下面的 Swift 代码。
if var visibleRows = tableView.indexPathsForVisibleRows,
let indexPathIndex = visibleRows.index(of: indexPath) {
visibleRows.remove(at: indexPathIndex)
tableView.reloadRows(at: visibleRows, with: .none)
}
Swift 4.2 测试
重新加载表视图后更新选定行的正确方法是:
// Saves selected rows
let selectredRows = tableView.indexPathsForSelectedRows
tableView.reloadData()
// Select row after table view finished reload data on the main thread
DispatchQueue.main.async {
selectredRows?.forEach({ (selectedRow) in
tableView.selectRow(at: selectedRow, animated: false, scrollPosition: .none)
})
}