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

最近翻出了之前的老项目,想做一下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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。