调用reloadData()时,UITableView的预期`contentOffset`是什么?

时间:2017-03-09 18:23:19

标签: ios uitableview cocoa-touch uikit ios10

我有UITableView显示自定义单元格。通过按下按钮,用户可以更改UITableView

的内容

情景:

  1. 加载包含1000个元素的数组
  2. 滚动表格到底部(滚动后给我约20,000 contentOffset.y
  3. 按下按钮,我用300个元素替换我的数组
  4. 在主线程(gcd)中调用reloadData
  5. 在第4步之后,contentOffset.y的正确新UITableView应该是什么?我预计它会为0并且我的表滚动到顶部但由于某种原因它不是并且不会滚动回顶部。这是UITableView的正常行为吗?

2 个答案:

答案 0 :(得分:2)

来自Apple的文档...... https://developer.apple.com/reference/uikit/uitableview/1614862-reloaddata

  

为了提高效率,表视图仅重新显示那些行   可见。如果表因此而缩小,它会调整偏移量   重装。

所以,是的,在reloadData上一直滚动到顶部是正常的。

如果想要它滚动到顶部,请使用content insert --uri content://com.test/x --bind column_name:s:new_value 或:

setContentOffset

答案 1 :(得分:1)

是的,这是UITableView的正常行为。如果您希望在重新加载后该表视图应滚动到顶部,则必须使用以下代码执行此操作。

let newOffset = CGPoint(x: currentOffset.x, y: 0)
tableView.setContentOffset(newOffset, animated: false)

自动调用reloadData函数时,UITableView会保留它的滚动偏移量。