带有 beginUpdates() 的 UITableView 反弹

Posted

技术标签:

【中文标题】带有 beginUpdates() 的 UITableView 反弹【英文标题】:UITableView with beginUpdates() bounces 【发布时间】:2017-12-28 09:55:04 【问题描述】:

我使用典型的组合 CoreData - NSFetchedResultsController - UITableViewController。 当我使用:

func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) 
  self.tableView.beginUpdates()

func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) 
  self.tableView.endUpdates()

通过更新数据源中的一项(不插入也不删除),有时,tableView 会无缘无故地上下跳动。

如果我有几个单元格,不足以填充表格视图,它不会反弹。

如果我有更多单元格来滚动表格视图,它不会反弹。

但是,如果我有足够的单元格来填充 tableview,这就是它反弹的地方。

如果我删除 beginUpdates()endUpdates(),则不会出现随机反弹,但我会失去 begin/endUpdates() 的优势。

预览可见here或over here

是什么原因造成的?以及如何解决?

【问题讨论】:

您在某处调用 tableView.reloadData() 导致此问题 设置tableView.bounces = false 我不会在任何地方打电话给tableView.reloadData() tableView.bounces = false 没有修复它。 这个我试过了,不行,还在弹跳。 【参考方案1】:

ios 11 类似问题上,替换为 [tableView performBatchUpdates:nil completion:nil];解决问题..

【讨论】:

很抱歉,但这似乎不起作用。我到底应该把 performBatchUpdates 放在哪里?【参考方案2】:
    tableView.beginUpdates()
    tableView.endUpdates()
    tableView.scrollToRow(at: indexPath, at: .top, animated: true)

【讨论】:

我最近在这里重新表述了这个问题:***.com/q/50981504/1126973 @nouatzi 在单元格子视图发生任何更改或通过折叠和展开调整单元格大小后 尽量避免 reloadData 只要你只改变单元格高度 你真的应该看看我最近的问题***.com/q/50981504/1126973 这个场景要简单得多。我不使用 reloadData

以上是关于带有 beginUpdates() 的 UITableView 反弹的主要内容,如果未能解决你的问题,请参考以下文章

iOS中的UITab冻结

我们如何为多个 UITab 使用相同的 WKWebView

在应用程序中使用两个不同的 uitab bar

执行“beginUpdates”“endUpdates”时 UITableView 页脚视图的动画问题

UITableView - BeginUpdates/EndUpdates 动画设置

何时在 CarPlay 中使用 beginUpdates() 和 endUpdates()