【发布时间】:2013-10-30 15:44:24
【问题描述】:
我有一个带有可选行的表格视图。
当我重新加载表格视图时,可能会添加(或删除)一些新行,并且表格视图单元格中的一些标签可能会更改。这就是我想通过调用[tableView reloadData] 来实现的目标。
不幸的是,该方法还清除了表格视图的整个状态 - 包括选择。但我需要保留选择。
那么如何在表格视图中重新加载所有数据,同时仍然保持选中的行?
【问题讨论】:
标签: ios uitableview reloaddata
我有一个带有可选行的表格视图。
当我重新加载表格视图时,可能会添加(或删除)一些新行,并且表格视图单元格中的一些标签可能会更改。这就是我想通过调用[tableView reloadData] 来实现的目标。
不幸的是,该方法还清除了表格视图的整个状态 - 包括选择。但我需要保留选择。
那么如何在表格视图中重新加载所有数据,同时仍然保持选中的行?
【问题讨论】:
标签: ios uitableview 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];
}
【讨论】:
具有一些优势的替代方法是仅重新加载尚未选择的行。 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)
})
}
【讨论】:
isSelected 属性应该反映model 的isSelected 属性的状态,反之亦然。直接操作视图是非常糟糕的习惯和低效。
最有效的方法是在数据模型中保持selected状态
isSelected。cellForRowAt中根据属性设置单元格的选中状态。didSelectRow 在数据源项中切换isSelected 并仅重新加载给定索引路径处的特定行。 【讨论】: