重新加载表格视图的数据而不清除其选择状态

时间:2013-10-21 23:27:52

标签: ios uitableview clear reloaddata

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

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

那么如何在保持所选行的选定行的同时重新加载表视图中的所有数据呢?

5 个答案:

答案 0 :(得分:20)

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

rowToSelect = [yourTableView indexPathForSelectedRow];

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

[yourTableView selectRowAtIndexPath:rowToSelect animated:YES scrollPosition:UITableViewScrollPositionNone];

答案 1 :(得分: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];
}

答案 2 :(得分:1)

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

  • 在表示数据源的结构或类中添加布尔属性isSelected
  • cellForRowAt中,根据属性设置单元格的选定状态。
  • didSelectRow中,切换数据源项中的isSelected,然后仅在给定的索引路径处重新加载特定的行。

答案 3 :(得分:0)

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

        if var visibleRows = tableView.indexPathsForVisibleRows,
            let indexPathIndex = visibleRows.index(of: indexPath) {
            visibleRows.remove(at: indexPathIndex)
            tableView.reloadRows(at: visibleRows, with: .none)
        }

答案 4 :(得分: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)
    })
}