18

我有一个带有可选行的表格视图。当我重新加载表格视图时,可能会添加(或删除)一些新行,并且表格视图单元格中的一些标签可能会更改。这就是我想通过调用来实现的[tableView reloadData]

不幸的是,该方法还清除了表格视图的整个状态——包括选择。但我需要保留选择。

那么如何重新加载表格视图中的所有数据,同时仍然保持选定的行被选中?

4

5 回答 5

25

您可以使用以下方式存储所选行的索引路径:

rowToSelect = [yourTableView indexPathForSelectedRow];

在重新加载数据之前。并在重新加载使用后:

[yourTableView selectRowAtIndexPath:rowToSelect animated:YES scrollPosition:UITableViewScrollPositionNone];
于 2013-10-21T23:47:43.580 回答
11

JeroVallis 解决方案适用于单一选择表视图。根据他的想法,这就是我如何使它与多项选择一起工作:

NSArray *selectedIndexPaths = [self.tableView indexPathsForSelectedRows];
[tableView reloadData];
for (int i = 0; i < [selectedIndexPaths count]; i++) {
    [tableView selectRowAtIndexPath:selectedIndexPaths[i] animated:NO scrollPosition:UITableViewScrollPositionNone];
}
于 2013-10-22T00:12:52.447 回答
3

最有效的方法是在数据模型中保持选中状态

  • 在表示数据源的结构或类中添加一个布尔属性isSelected
  • cellForRowAt根据属性设置单元格的选中状态。
  • 在数据源项中didSelectRow切换isSelected并仅重新加载给定索引路径处的特定行。
于 2018-12-06T09:24:50.703 回答
0

具有一些优势的替代方法是仅重新加载尚未选择的行。下面的 Swift 代码。

        if var visibleRows = tableView.indexPathsForVisibleRows,
            let indexPathIndex = visibleRows.index(of: indexPath) {
            visibleRows.remove(at: indexPathIndex)
            tableView.reloadRows(at: visibleRows, with: .none)
        }
于 2018-05-03T13:06:07.520 回答
0

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)
    })
}
于 2018-12-06T09:11:34.397 回答