【问题标题】:UITableView with beginUpdates() bounces带有 beginUpdates() 的 UITableView 反弹
【发布时间】: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() 的优势。

预览可见hereover here

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

【问题讨论】:

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

标签: ios uitableview core-data nsfetchedresultscontroller


【解决方案1】:

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

【讨论】:

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

【讨论】:

  • 我最近在这里重新表述了这个问题:stackoverflow.com/q/50981504/1126973
  • @nouatzi 在单元格子视图发生任何更改或通过折叠和展开调整单元格大小后
  • 尽量避免 reloadData 只要你只改变单元格高度
  • 你真的应该看看我最近的问题stackoverflow.com/q/50981504/1126973 这个场景要简单得多。我不使用 reloadData
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 2011-01-31
相关资源
最近更新 更多