美文网首页
【iOS11有坑】UITableView的数据源和代理执行顺序

【iOS11有坑】UITableView的数据源和代理执行顺序

作者: Keizo | 来源:发表于2018-01-25 20:54 被阅读0次

最近翻出了之前的老项目,想做一下iphoneX适配,碰巧发现了一个关于iOS 11的坑,简单描述一下:

  • 在一个继承UITableViewController的VC中,我在以下的代理方法里面给一个属性赋了值
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
  • 接着在下述的数据源方法中用到了该属性的值
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  • 但是效果并不是理想的,经过断点发现,先调用了cellForRowAtIndexPath的方法,然后才走到heightForRowAtIndexPath,这跟之前的版本有较大差别(内心OS:mmp哪有先设置内容再设置高度的)

有了上述不靠谱的经验,我又在简书发现一篇相关博文,讲到了iOS10之前的版本中,这两个方法顺序也是不一致的

结论:

  • iOS7.1中先依次调一遍heightForRow方法再依次调一遍cellForRow方法,在调cellForRow方法的时候并不会再调一次对应的heightForRow方法。

    iOS7.1行数为10
    iOS7.1行数为20
  • iOS8中先依次调heightForRow(如果行数超过屏幕依次调用两次,如果行数很少,没有超过屏幕,只依次调用一次),之后每调一次cellForRow的时候又调一次对应的heightForRow方法。

    iOS8行数为10
    iOS8行数为20
  • iOS9iOS10中,heightForRow方法会先调用三次,然后每调用一次cellForRow的时候再调用一次对应的heightForRow

(以上低版本结论转载自Code_Ninja的博文,在低版本上的逻辑,都是heightForRow的实现在cellForRow之前,但在iOS11上就不一样了)

  • iOS11中,先调用heightForRow,再调用cellForRow
    iOS11

相关文章

网友评论

      本文标题:【iOS11有坑】UITableView的数据源和代理执行顺序

      本文链接:https://www.haomeiwen.com/subject/txhbaxtx.html