插入新行时,UITableView会跳转

我尝试了很多方法来解决这个问题,但我做不到。 我的tableView在加载更多数据后跳转。 我在willDisplay调用下载方法:

 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { let lastObject = objects.count - 1 if indexPath.row == lastObject { page = page + 1 getObjects(page: page) } } 

并在此处插入行:

 func getObjects(page: Int) { RequestManager.sharedInstance.getObjects(page: page, success: { objects in DispatchQueue.main.async(execute: { self.objects = self.objects + objects self.tableView.beginUpdates() var indexPaths = [IndexPath]() for i in 0...objects.count - 1 { indexPaths.append(IndexPath(row: i, section: 0)) } self.tableView.insertRows(at: indexPaths, with: .bottom) self.tableView.endUpdates() }); }) } 

那我错了什么? 为什么tableView在插入新行后会跳转?

我有一个类似tableViews问题。 部分我在帮助下做出了决定

 self.tableView.beginUpdates() self.tableView.endUpdates() 

但这并没有解决问题。 对于iOS 11,问题仍然存在。 我添加了一个具有所有单元格高度的数组,并在方法中使用了这些数据

 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return cellHeights[indexPath.row] ?? 0 } 

还要添加此方法

 func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return cellHeights[indexPath.row] ?? 0 } 

之后,跳跃停止了。

因为你的循环从0运行到对象计数:

 for i in 0...objects.count - 1 { indexPaths.append(IndexPath(row: i, section: 0)) } 

索引路径生成计数行0直到对象的计数。 因此行被添加到表的顶部(即第0行),因此导致tableview跳转到tableview底部。

尝试改变范围:

  let rangeStart = self.objects.count let rangeEnd = rangeStart + (objects.count - 1) for i in rangeStart...rangeEnd { indexPaths.append(IndexPath(row: i, section: 0)) } 

希望能帮助到你..!!!

首先,检查你的tableView(_:estimatedHeightForRowAt:) – 这永远不会准确,但是单元格高度越有可能结束这个估计,表格视图的工作就越少。

因此,如果您的表格视图中有100个单元格,那么其中50个单元格肯定最终会达到75的高度 – 这应该是估算值。

此外值得一段时间注意到表格视图可能向其代表询问确切的单元格高度的次数没有限制。 因此,如果您有一个1000行的表视图,那么单元格布局上会出现很大的性能问题(以秒为单位的延迟) – 实现估计会大大减少这些调用。

您需要重新审视单元格设计的第二件事是,是否有任何视图或控件的高度需要由表视图计算? 就像具有顶部和底部锚点的图像相当于其他视图的高度从一个单元格到另一个单元格的变化?

这些视图/控件的固定高度越高,表格视图就越容易布局其单元格。

我有两个表视图的问题,其中一个有一个嵌入到堆栈视图中的可变高度图像,我必须实现估计。 另一个没有固定大小的图像,我不需要实现估计,使其顺利滚动。 两个表视图都使用分页。

最后但并非最不重要的是,数组是结构。 结构是值类型。 所以也许你不想在arrays中存储任何高度,看看你制作了多少副本? 计算tableView(_:heightForRowAt:)的高度是非常快速和有效的,足以很好地解决。