【问题标题】:Swift 3 | TableView ScrollToTop on reloadData with dynamic cell size斯威夫特 3 |具有动态单元格大小的 reloadData 上的 TableView ScrollToTop
【发布时间】:2017-04-22 00:35:21
【问题描述】:

我有一个动态单元格大小的 TableView:

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 20

我的单元格里面有文本,当然,文本高度可以根据其内容的功能而改变。

有时我只有一条线,有时我有更多,这意味着有时我的单元格高度为 20,有时更多。

当我尝试重新加载我的 tableview 数据并滚动到顶部时遇到问题。

这就是我的工作:

myTableViewDatas = newDatas
tableView.setContentOffset(CGPoint.zero, animated: false)
tableView.reloadData()

很难向您展示这种情况,但它不会滚动到Y = 0,而是滚动到Y = 100 或类似的东西。因为我的单元格大小会随着要显示的内容的功能而变化。

如果我删除动态大小并执行:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 20
}

并且仍然滚动到顶部:

myTableViewDatas = newDatas
tableView.setContentOffset(CGPoint.zero, animated: false)
tableView.reloadData()

==> 这是有效的,我滚动到Y = 0

我想我什么都试过了:

  • scrollToRow

  • scrollRectToVisible

  • scrollsToTop

我仍然有这个问题。 唯一可行的方法是如果我延迟reloadData

myTableViewDatas = newDatas
tableView.setContentOffset(CGPoint.zero, animated: false)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
    tableView.reloadData()
}

这是可行的,但它会产生“故障” => 它会显示新数据然后自动滚动到顶部,这对用户来说是令人不安的。

另一种解决方案是使用“reloadSections”:

myTableViewDatas = newDatas
tableView.setContentOffset(CGPoint.zero, animated: false)
tableView.reloadSections(IndexSet(integer: 0), with: .none) // I have only one section

它也可以工作,但它也会产生“故障”,这就像 TableView 重新加载了一个动画(即使我设置了 .none),其中显示的单元格在新数据的功能中被缩小/放大。

我真的找不到“合适的”解决方案来解决这个问题,有没有人遇到过这个问题? TY

【问题讨论】:

  • 如果更改调用顺序会怎样?您可以滚动到顶部,然后重新加载数据。
  • @Holly 感谢您的回答,如果我更改通话顺序 => 什么都没有发生,它滚动到顶部的唯一方法是我将 contentOffset 设置为 0,然后重新加载数据。
  • 您从哪个线程执行该代码?
  • @Holly 一切都在主线程中完成,我有 IBAction,用户可以在其中过滤 TableView 中显示的结果

标签: ios uitableview swift3 scrolltop


【解决方案1】:

嗯,有时您搜索复杂的解决方案,实际上它很简单。 我做了: - 首先重新加载 - scrollToIndexPath 0 秒 -> 有效

myTableViewDatas = newDatas
tableView.reloadData()
tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: false)

【讨论】:

    【解决方案2】:

    我也有同样的问题。 [UITableView reloadData] 不像我们预期的那样工作。 它不会从 cleanslate 布局 tableView。

    从头开始重新加载所有内容。重新显示可见行。请注意,这将导致删除任何现有的放置占位符行。

    它说重新显示可见行。所以这就是我所做的。

    data = nil;  // clear data.
    
    [tableView reloadData];  // reloadd tableView so make it empty.
    
    [tableView setNeedsLayout];  // layout tableView.
    [tableView layoutIfNeeded];
    
    data = the data;  // set the data you want to display.
    
    [tableView reloadData];   // reload tableView
    

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 2017-03-24
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多