在 UiTableView reloadData 之后保留选定的部分/行

Posted

技术标签:

【中文标题】在 UiTableView reloadData 之后保留选定的部分/行【英文标题】:Keeping selected section / row after UiTableView reloadData 【发布时间】:2014-04-24 07:31:56 【问题描述】:

我有一个UITableView,选择UITableViewCell i @ i调用web服务来获取新数据,然后用新数据重新加载UITableView

现在,所选行将始终是返回的新数据的一部分。但是,一个部分中的行数不会是恒定的。

我试图在我重新加载表格视图后选择的行上保持选择。我从didSelectRowAtIndexPath 保存了indexPath。但是当我打电话时:

    [self.tableView selectRowAtIndexPath:self.selectedIndexPath 
                                animated:NO 
                          scrollPosition:UITableViewScrollPositionNone];

没有任何反应,我选择的行在重新加载后不再被选中。在重新加载UITableView 后是否有保留选择?

【问题讨论】:

你能在数据中添加某种选择标志吗? 数据在一个数组中 - 每次随着数据的变化而发生选择时,我都会得到一个新的数据副本。不变且始终保证的是从新数据中取回所选项目。 ***.com/questions/1827176/… 将选中的项目放入本地 iVar,在 cellforrowatindex 路径中进行相等性检查,因此当它重新加载单元格时,它会将传入的数据与您保存的 iVar 进行比较。如果匹配,则调用 selecteRowAtIndexPath 方法。 【参考方案1】:

试试

dispatch_async(dispatch_get_main_queue(), ^ 
      [self.tableView selectRowAtIndexPath:self.selectedIndexPath 
                                  animated:NO 
                            scrollPosition:UITableViewScrollPositionNone];
);

另外,请确保您的self.indexPath 属性在重新加载UITableView 后将代表同一个单元格。

【讨论】:

这没有帮助。我认为问题可能在于单元格移动到不同的行。它仍然在同一部分,但从第 4 行(例如)移动到第 1 行,因为它是该部分中唯一剩下的项目? 所以你不应该依赖 indexPath。您需要保存数据的选定元素并在重新加载后在新数据中找到它的索引。使用此索引,您将能够创建 NSIndexPath 对象并选择有效单元格 如何保存选中的元素?当我重新加载表格视图时,数据模型会刷新。当我不再需要它时,我不会存储从内存中释放出来的数据。如果我将索引路径保存为 0,我可以让选择工作。但正如你所指出的,如果有不止一行,这可能会导致问题.. 那我相信你有两个选择。在所有表格视图生命周期中存储您的数据和选定元素,或将有关选定元素的信息直接保存在数据中 通过 indexPath 保存,我认为它不起作用,因为您从服务器获取的数据总是在变化。当您单击一行时,您会保存 key-id(我的意思是您可以区分单元格的键)。在那个 for 循环之后找到那个键,到那时,你会得到实际的 indexPath。【参考方案2】:

reloadData 之前,保留选定的索引路径。重新加载后,使用selectRowAtIndexPath:,重新设置选定的行,例如

NSArray<NSIndexPath *> *indexPathsForSelectedRows = self.itemsTableView.indexPathsForSelectedRows; // multiple selection

NSIndexPath *indexPathForSelectedRow = self.itemsTableView.indexPathForSelectedRow;   // single selection

[self.tableView reloadData];

[self.tableView selectRowAtIndexPath:indexPathForSelectedRow animated:NO scrollPosition:UITableViewScrollPositionNone]; // single selection

for (int i = 0; i < indexPathsForSelectedRows.count; i++) 
    [self.tableView selectRowAtIndexPath:indexPathsForSelectedRows[i] animated:NO scrollPosition:UITableViewScrollPositionNone]; // multiple selection

【讨论】:

以上是关于在 UiTableView reloadData 之后保留选定的部分/行的主要内容,如果未能解决你的问题,请参考以下文章

在 UITableView 上延迟 reloadData

iOS UITableView reloadData 刷新结束后执行后续操作

UITableView 没有在 reloadData 上重新加载

ReloadData (UITableView) 不起作用

UITableView 在 reloadData 后自动向下滚动

UITableView 奇怪的 reloadData 问题