CellForRowAtIndexPath被意外调用

时间:2018-08-03 11:29:21

标签: ios iphone swift uitableview ipad

我有一个表格视图,其中包含12种以上不同类型的单元格。我正在使用自动调整大小,并且所有单元格的约束均已正确设置。一切都可以在iPhone模拟器上完美运行,但是在iPad模拟器上,一切都很好,直到

  1. 我单击表格视图中的链接,然后显示一个外部浏览器。
  2. 我点击主页按钮,然后将应用置于后台。

一旦我返回/重新打开应用程序,表格视图就会自动滚动到一个随机位置,并且,一旦应用程序进入后台,cellForRowAtIndexPath就会被调用多次(仅用于显示周围/包括显示的索引)单元格的索引),看起来表格视图会在应用程序进入后台后自动自动滚动。

我100%肯定在任何地方都不会调用tableview.reloadData(),也未实现applicationDidEnterBackground。

想知道是否有人遇到过同样的问题,潜在的原因是什么?我用XCode 9.3和iOS 9.3和11.3的iPad模拟器进行了测试。

该情况如下所示

scenario

1 个答案:

答案 0 :(得分:1)

我弄清楚了原因,这是由于估计的高度不准确,并且tableview做一些奇怪的事情。 IOS 8 UITableView self-sizing cells jump/shift visually when a new view controller is pushed

我通过缓存单元格的高度来解决该问题,如果未缓存高度,则在估计的HeightForRow中返回UITableViewAutomaticDimension;如果已缓存高度,则返回var cellEstimatedHeightCache = [Int: CGFloat]() func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { guard let height = cellEstimatedHeightCache[indexPath.row] else { return UITableViewAutomaticDimension } return height } func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { cacheCellHeight(row: indexPath.row, height: cell.frame.size.height) } private func cacheCellHeight(row: Int, height: CGFloat) { cellEstimatedHeightCache[row] = height }

伪代码-Swift 4:

<div class="container">
  <kendo-grid
  [kendoGridBinding]="users"
  [pageSize]="10"
  [pageable]="true"
  [sortable]="true"
  [filterable]="true"
  [groupable]="true"
  [height]="510">
<kendo-grid-column field="userId" title="Id" [width]="60"></kendo-grid-column>
<kendo-grid-column field="userName" title="Name" [width]="120"></kendo-grid-column>
<kendo-grid-column field="userAddress" title="Address" [width]="100"></kendo-grid-column>
<kendo-grid-column field="userStatus" title="Status" [width]="130"></kendo-grid-column>
</kendo-grid>
</div>