【问题标题】:iOS 8 Xcode6 heightForRowAtIndexPath called extra timesiOS 8 Xcode6 heightForRowAtIndexPath 调用了额外的时间
【发布时间】:2014-10-15 16:29:18
【问题描述】:

我刚刚下载了 Xcode6 Beta6,发现我的 App 有一些奇怪的缺陷。经过一些初步调试后,我发现heightForRowAtIndexPath 被多次调用,并造成了一些不良影响。

通常,我希望 heightForRowAtIndexPath 被调用的次数比我显示的行多 2 次。因此,当我硬编码 numberOfRowsInSection 以返回 3 时,我应该会看到 heightForRowAtIndexPath 被调用 5 次。在 iOS 7 中就是这种情况,但是当我在 Xcode6 Beta6 中进行测试时,我看到 heightForRowAtIndexPath 被调用了 7 次。当我返回 4 时,该方法被称为 9、5 和它的 11。所以看起来模式是我硬编码的行数 + 1 的两倍。

有没有其他人遇到过这个问题或找到了解决方法?仅仅能够确认这是一个 iOS 错误将是一个巨大的帮助,因为这样我就可以将这个缺陷推迟到以后,因为 Apple 可能会自行解决这个问题。


编辑:这个问题在 Xcode 6 GM 中仍然存在


编辑 2:Apple 回复并关闭了我的错误报告,这里有回复:

委托的 API 约定是我们可以随意调用此方法。

我想我们只需要处理这个问题,并且应该编写不依赖于调用此委托的确切时间。

【问题讨论】:

  • 那太棒了!
  • 可能值得filing a radar
  • 即使在 Beta 7 上我也遇到了同样的问题
  • @MrTJ 我遇到了同样的问题,但这不是我上面描述的。在 iOS 8 表格行中,默认情况下会自行调整大小以适应其中的内容。在他们使用默认大小 44 之前,我将 tableView.rowHeight = 44 设置为它们对我来说再次显得正常。同样对于上述问题,我仍然在 GM 中看到这种情况,可能只是一种新的处理方式,我必须创建一个没有像以前一样使用 heightForRow 的解决方法..
  • @instaable 抱歉,我刚刚找到了针对我的问题的解决方法。我正在使用此方法来切换全局属性并根据该变量状态更改单元格的高度。我改为将全局属性更改为存储在每个自定义单元格对象中。因此,heightForRow 是否被额外调用并不重要。

标签: xcode uitableview ios8


【解决方案1】:

从 iOS 8 开始,Apple 改变了他们决定表格视图内容大小的方式。这是为了进一步优化它,让我们在桌子设计上更有活力。

作为其中的一部分,他们现在不再一次调用所有行的 heightForRowAtIndex 路径,而是根据需要调用它多次以确定内容大小。内容大小的确定也是动态的,因此需要多次调用。

不要在 heightForRowAtIndexPath 方法中进行任何高度计算。而是编写一个私有方法,并将其视为过去的 heightForRowAtIndexPath。将所有高度存储在字典中,以 NSIndexPath 对象作为键。

当然,如果数据发生变化,这意味着在调用 reloadData 之前调用这个私有方法。

【讨论】:

  • 哇,谢谢。这只是为我正在使用的 tableview 节省了大约 200 毫秒的加载时间(它有 16 个在不同时间高度不同的单元格)。
  • @deepak-g-m 这也适用于 UICollectionView 吗?
【解决方案2】:

对我来说,自定义 tableViewCells 的动态高度导致了问题,具体来说,heightForRowAtIndexPath 和estimatedHeightForRowAtIndexPath 委托方法。一个适用于 iOS 7,另一个适用于 iOS 8。通过有条件地检查 iOS 版本解决了这个问题。

编辑:由于我们必须同时支持 iOS 7 和 8,以及 Xcode6 的 Beta 版和第二天提交的项目,这个答案是我在 2014 年中期的解决方案。如果投反对票,请注意给出原因。

【讨论】:

  • 您能否分享一下您是如何有条件地调用上述两位代表的。我也面临同样的问题......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 2013-05-28
  • 2012-09-21
相关资源
最近更新 更多