【问题标题】:Keep selected cell on heavily reloadRowsAtIndexPaths UITableView将选定的单元格保持在大量 reloadRowsAtIndexPaths UITableView
【发布时间】:2012-10-14 07:08:03
【问题描述】:

在其中一个视图中,有一个 UITableView 会经常更新。 使用“reloadRowsAtIndexPaths”以经典方式跟踪更改

-(void)refreshCells:(NSArray *)changedCells
{
    NSLog(@"refreshCells %i",[changedCells count]);
    [TableView beginUpdates];
    [TableView reloadRowsAtIndexPaths:changedCells withRowAnimation:UITableViewRowAnimationBottom];
    [TableView endUpdates];
}

问题:如何保留用户最后选择的单元格。每次更新refreshCells后单元格位置可能会改变?

【问题讨论】:

  • Afaik reloadRowsAtIndexPaths 只是为“changedCells”中的每个索引路径调用代表 cellForRowAtIndexPath,因此单元格的数量保持不变,因此索引路径保持不变。当然,如果由于某种原因您更改了 cellForRowAtIndexPath 返回它们的顺序,那么只有您可以知道所选单元格的去向^^
  • 我也遇到了这个问题。我正在使用reloadRowsAtIndexPaths:withRowAnimation: 重新加载一个单元格。为什么它取消选择该单元格?这似乎是 iOS SDK 的一个错误。否则,应调用该方法:reloadAndDeselectRowsAtIndexPaths:withRowAnimation:.

标签: objective-c ios uitableview cell


【解决方案1】:

您可以保存当前选择

NSIndexPath *selectedRow = [self.tableView indexPathForSelectedRow];

在重新加载之前并再次选择它

if (selectedRow) {
    [self.tableView selectRowAtIndexPath:selectedRow animated:NO scrollPosition:UITableViewScrollPositionNone];
}

重新加载后。除非您调用insertRowsAtIndexPaths:deleteRowsAtIndexPaths:,否则单元格位置不会改变。

【讨论】:

  • 将动画属性设置为 NO 不会让用户看到取消选择和选择步骤。因此,用户在重新加载单元格时不会注意到该行被取消选择。
  • 如果您只想选择未选中的单元格,则可以在if (selectedRow 之后插入&& ![self.tableView indexPathForSelectedRow]。但是,如果您使用 animated:NOscrollPosition:UITableViewScrollPositionNone,我会忽略它,因为有了这些参数,它不会有任何区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 2013-11-04
  • 2014-03-30
相关资源
最近更新 更多