zoukankan      html  css  js  c++  java
  • tableView代理方法的调用时间,(主要是heightForRowAtIndexPath和cellForRowAtIndexPath调用时间)

    最近做一个demo,涉及按照数据分类然后依照分类在cellForRowAtIndexPath形成不同类型的cell,就是有判断(在viewdidload里面做)和形成(在cellForRowAtIndexPath做)两个阶段。这个时候我就有了一个疑问,viewdidload和cellForRowAtIndexPath是什么顺序进行的,于是在几个函数里面记录打印了一下过程:

    2015-03-03 13:14:20.970 whenToCom[9790:1381585] -[ContacterTableViewController viewDidLoad]
    2015-03-03 13:14:21.167 whenToCom[9790:1381585] -[ContacterTableViewController viewWillAppear:]
    2015-03-03 13:14:21.171 whenToCom[9790:1381585] -[ContacterTableViewController numberOfSectionsInTableView:]
    2015-03-03 13:14:21.172 whenToCom[9790:1381585] -[ContacterTableViewController tableView:numberOfRowsInSection:]
    2015-03-03 13:14:21.173 whenToCom[9790:1381585] -[ContacterTableViewController tableView:heightForRowAtIndexPath:]
    2015-03-03 13:14:21.174 whenToCom[9790:1381585] -[ContacterTableViewController tableView:heightForRowAtIndexPath:]
    2015-03-03 13:14:21.177 whenToCom[9790:1381585] -[ContacterTableViewController viewDidAppear:]
    2015-03-03 13:14:21.181 whenToCom[9790:1381585] -[ContacterTableViewController numberOfSectionsInTableView:]
    2015-03-03 13:14:21.182 whenToCom[9790:1381585] -[ContacterTableViewController tableView:numberOfRowsInSection:]
    2015-03-03 13:14:21.195 whenToCom[9790:1381585] -[ContacterTableViewController tableView:heightForRowAtIndexPath:]
    2015-03-03 13:14:21.197 whenToCom[9790:1381585] -[ContacterTableViewController tableView:heightForRowAtIndexPath:]
    2015-03-03 13:14:21.199 whenToCom[9790:1381585] -[ContacterTableViewController tableView:cellForRowAtIndexPath:]
    2015-03-03 13:14:21.206 whenToCom[9790:1381585] -[ContacterTableViewController tableView:heightForRowAtIndexPath:]
    2015-03-03 13:14:21.208 whenToCom[9790:1381585] -[ContacterTableViewController tableView:cellForRowAtIndexPath:]
    2015-03-03 13:14:21.211 whenToCom[9790:1381585] -[ContacterTableViewController tableView:heightForRowAtIndexPath:]

      可以发现 tableView的cellForRowAtIndexPath是在viewdidappear后才执行的。

      但是,又有了第二个疑问,我这个table里面有两条数据,但是heightForRowAtIndexPath方法为什么却执行了6次,而且只有最后两次才是与cellForRowAtIndexPath交互执行,也就是说真正才是在绘制cell。在网上搜索了半天没结论,参考了一些类似的问题,猜测是在viewWillAppear和viewDidAppear之间的两次调用是用于预估tableView的高度,紧跟viewDidAppear之后的两次是实际计算tableView的高度,最后两次是绘制cell。

      顺便PS一下View的生命周期的区别(原链接): 

    当一个视图控制器被创建,并在屏幕上显示的时候。 代码的执行顺序

    1、 alloc                                   创建对象,分配空间

    2、init (initWithNibName) 初始化对象,初始化数据

    3、loadView                          从nib载入视图 ,通常这一步不需要去干涉。除非你没有使用xib文件创建视图

    4、viewDidLoad                   载入完成,可以进行自定义数据以及动态创建其他控件

    5、viewWillAppear              视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了

    6、viewDidAppear               视图已在屏幕上渲染完成

    当一个视图被移除屏幕并且销毁的时候的执行顺序,这个顺序差不多和上面的相反

    1、viewWillDisappear            视图将被从屏幕上移除之前执行

    2、viewDidDisappear             视图已经被从屏幕上移除,用户看不到这个视图了

    3、dealloc                                 视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放

    此外还有+load和+initialize方法,这两个方法都可以用在类加载之前执行初始化任务,而且每个类都只会调用一次。区别在于load是在程序启动时调用,而且不遵守子类父类的覆写规则,而initialize只会在类调用时调用,使用这两个方法时要注意循环调用的问题

     

  • 相关阅读:
    Flex 布局语法教程
    Uni-App
    springBoot框架中几个层(dto、dao、service、controller)之间的关系
    delphi Restful:客户端实现的四种方式及其比较
    Node.js安装及环境配置之Windows篇
    MySQL 8.0.18安装教程(windows 64位)
    JDK下载和安装
    【转载】G1垃圾回收器详解
    【转载】单线程Redis性能为何如此之高?
    快速开发框架天梭(Tissot)
  • 原文地址:https://www.cnblogs.com/Kelphizy/p/4310758.html
Copyright © 2011-2022 走看看