最近做一个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中创建的对象进行释放

tableView代理方法的调用时间,(主要是heightForRowAtIndexPath和cellForRowAtIndexPath调用时间)的更多相关文章

  1. tableView代理方法执行顺序

    tableView代理方法执行顺序,随着iOS系统版本的不断升级,执行顺序也有所变化 1.iOS7.1中先依次调一遍heightForRow方法再依次调一遍cellForRow方法,在调cellFor ...

  2. tableview 代理方法详解

    typedef NS_ENUM(NSInteger, UITableViewCellAccessoryType) { UITableViewCellAccessoryNone, // 不显示任何图标 ...

  3. ios开发网络学八:NSURLSession相关代理方法

    #import "ViewController.h" @interface ViewController ()<NSURLSessionDataDelegate> /* ...

  4. ios文本框基本使用,以及所有代理方法的作用

    /* UITextField文本输入框 */ UITextField * textField = [[UITextField alloc]initWithFrame:CGRectMake(50, 50 ...

  5. ios UITextField文本框基本使用,以及所有代理方法的作用

    /* UITextField文本输入框 */ UITextField * textField = [[UITextField alloc]initWithFrame:CGRectMake(50, 50 ...

  6. IOS中tableView每组的头部控件、通过tableView的代理方法控制某一行的cell能否达到高亮选中状态

    一.tableView每组的头部控件 1.控件宽度默认就是tableView的宽度 2.控件高度由下面的代理方法决定 - (CGFloat)tableView:(UITableView *)table ...

  7. CAAnimationDelegate 代理方法没调用

    CAAnimationDelegate 代理方法没调用 应该在 addAnimation调用之前设置代理

  8. 第4篇-JVM终于开始调用Java主类的main()方法啦

    在前一篇 第3篇-CallStub新栈帧的创建 中我们介绍了generate_call_stub()函数的部分实现,完成了向CallStub栈帧中压入参数的操作,此时的状态如下图所示. 继续看gene ...

  9. 第29篇-调用Java主类的main()方法

    在第1篇中大概介绍过Java中主类方法main()的调用过程,这一篇介绍的详细一点,大概的调用过程如下图所示. 其中浅红色的函数由主线程执行,而另外的浅绿色部分由另外一个线程执行,这个线程最终也会负责 ...

随机推荐

  1. Ubuntu 12.04 使用Eclipse搭建C/C++编译环境

    首先是安装Eclipse,方法有两种:       第一种是通过Ubuntu自带的程序安装功能安装Eclipse,应用程序->Ubtuntu软件中心,搜Eclipse安装即可.       第二 ...

  2. module_init和init_module的区别

    今天在看CS8900的驱动时,发现其驱动的模块加载函数是init_module(),由于看到大多数的驱动用的模块加载函数大多是module_init()函数,所以一时没缓过神来,总是在找CS8900的 ...

  3. 快速傅里叶变换(FFT):COGS 2216. 你猜是不是KMP

    2216. 你猜是不是KMP ★★★☆   输入文件:guess.in   输出文件:guess.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] XX在玩两个串的游戏. ...

  4. 使用yum快速升级CentOS 6.5内核到 3.10.28

    网上有不少升级CentOS内核的文章,如<CentOS 6.5 升级内核到 3.10.28>,大部分都是下载源码编译,有点麻烦. 在yum的ELRepo源中,有mainline(3.13. ...

  5. 2013=10=19 ENGLISH 翻译

    数据结构习题及答案 严蔚敏_课后习题答案 http://www.doc88.com/p-243584884293.html 273089354 随着女性获得平等权力的趋势,女性日渐增长的经济权力以及为 ...

  6. [Locked] Wiggle Sort

    Wiggle Sort Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= ...

  7. [Java] JavaMail 发送 html 格式、带附件的邮件

    本案例演示发送 html 格式,可带附件的邮件发送.发送纯文本邮件的例子可参照上一篇博文JavaMail 简单案例. EmailHelper, Email 的帮助类,向帮助类提供 SMTP 服务器域名 ...

  8. G - Shuffle'm Up

    题目大意: 是一个洗牌游戏,首先给出两堆牌,s1,s2,先从s1上面拿一张牌再从s2上面拿一张牌依次往下可以洗好牌,然后把洗好的牌再分成两堆继续洗,直到这堆牌的顺序与给的顺序相同可以停止,当然如果洗不 ...

  9. Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.5:clean (default-clean) on project taotao-manager-web: Failed to clean project: Failed to delete \target\tomcat\logs\access_log.201

    点击console右上角叉号然后再点击红色小方形terminate

  10. scipy安装失败

    pip install scipy安装失败 可以从uci网站下载wheel安装包然后执行pip install xx.whl进行安装 http://www.lfd.uci.edu/~gohlke/py ...