我刚刚下载了Xcode6 Beta6并在我的应用中发现了一些奇怪的缺陷。经过一些初步调试后,我发现heightForRowAtIndexPath
被多次调用,并造成一些不良影响。
通常情况下,我希望heightForRowAtIndexPath
比我显示的行多出2次。因此,当我将numberOfRowsInSection
硬编码为3时,我应该看到heightForRowAtIndexPath
被调用5次。在iOS 7中就是这种情况,但是当我在Xcode6 Beta6中测试时,我看到heightForRowAtIndexPath
被调用了7次。当我返回4时,该方法被调用为9,5及其11。因此,模式似乎是我硬编码的行数的两倍+。
有没有其他人遇到过此问题或找到解决方法?只是能够确认这是一个iOS错误将是一个巨大的帮助,因为我可以推迟缺陷,因为Apple可以自己解决这个问题。
修改:Xcode 6 GM
中仍存在此问题编辑2: Apple回复并关闭了我的错误报告,这里有回复:
委托的API合约是我们可以根据需要调用此方法。
我想我们只需处理这个问题,并且代码不应该完全依赖于调用此委托的时间。
答案 0 :(得分:12)
从iOS 8开始,Apple改变了他们决定表格视图内容大小的方式。这是为了进一步优化它,使我们在桌面设计中拥有更多的活力。
作为其中的一部分,他们现在不再为一次拍摄中的所有行调用heightForRowAtIndex路径,而是只是为了确定内容大小而多次调用它。内容大小确定也是动态的,因此多次调用。
不要在heightForRowAtIndexPath方法中进行任何高度计算。而是编写一个私有方法并将其视为过去的heightForRowAtIndexPath。将所有高度存储在字典中,并将NSIndexPath对象作为键。
当然,这意味着在调用reloadData之前调用此私有方法,如果数据已更改。
答案 1 :(得分:3)
对我来说,自定义tableViewCells的动态高度导致了一个问题,特别是heightForRowAtIndexPath和estimatedHeightForRowAtIndexPath委托方法。一个适用于iOS 7,另一个适用于iOS 8.通过有条件地检查iOS版本来解决它。
编辑:由于我们必须同时支持iOS 7和8,以及第二天的Xcode6的Beta版本以及我们的项目提交,这个答案在2014年中期为我提供了解决方案。如果是downvoting请注意理由。