美文网首页
【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