initWithNibName与viewDidLoad的执行关系以及顺序

一个ViewController,一般通过init或initWithNibName来加载。二者没有什么不同,init最终还是要调用initWithNibName方法(除非这个ViewController没有nib文件)。

我们经常在initWithNibName方法中初始化视图,变量或者其他成员。这是最常见的initWithNibName方法写法:

- (id)initWithNibName:(NSString *)nibNameOrNilbundle:(NSBundle *)nibBundleOrNil

{

    self = [superinitWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self) {

        label=[[UILabelalloc]initWithFrame:

                  CGRectMake(0,0,160,160)];

        [self.viewaddSubview:label];

...

    }

    returnself;

}

在if语句中,包含了最常见的成员初始化代码。

在这段代码中,如果你向ViewController的视图树中加入一些新的UIView子类,比如上面的代码:

[self.viewaddSubview:label];

这不会有什么问题。但是这会导致另一个方法的调用,即viewDidLoad方法。

viewDidLoad方法一般情况下只会在nib文件已载入内存(即视图树构建完成)之后调用。

但还有另一种情况,如果ViewController的view属性被引用时,view=nil,也会导致nib的加载行为,从而也导致viewDidLoad方法的调用。如果你在initWithNibName方法一直不引用view属性,则直至initWithNibName方法结束,viewDidLoad方法也不会触发。

你也许奇怪,如果在代码中你一直不引用这个ViewController的view属性怎么办?那么是不是viewDidLoad方法一直都不会调用了?

它会在ViewController对象第1次present时调用,比如你使用presentModalViewController或pushViewController方法弹出它。这两个方法同时还会调用ViewController的appear方法(即viewWillAppear方法和viewDidAppear方法)。

viewDidLoad方法会比appear方法要早执行(appear方法会导致一个弹出动画产生)。而且如果在present之前已经执行过viewDidLoad方法,则present方法不会触发viewDidLoad方法。

这就是为什么我们会奇怪viewDidLoad方法中的代码有时执行有时似乎不被执行的原因。其实根源还是在initWithNibName方法的if语句中。

如果你在initWithNibName时,引用了ViewController的view属性,由于此时view为nil,将触发nib文件的加载行为,导致viewDidLoad方法不等present就提前调用了。由于initWithNibName方法中ViewController成员还未初始化,导致任何对这些成员的引用都是无效的。

比如在viewDidLoad方法中,由于该方法提前执行,导致数据访问对象还是nil(initWithNibName仍然未执行完)。如果此时在viewDidLoad方法想通过数据访问对象获取表格数据,将得到空。这样从表面上看,viewDidLoad方法似乎未被执行。

这个情况可以通过两种方法来改进:

一、initWithNibName方法中,不要有任何成员初始化的代码。把这些代码移到viewDidLoad方法开始进行。

二、由于initWithNibName方法保证是在present方法中进行,我们也可以在initWithNibName方法中保留成员初始化代码。但把原来viewDidLoad方法中的代码移到appear方法中。也就是,最好不要在viewDidLoad方法中进行和成员初始化无关的事情。这样还有一个好处,每次presentViewController,都会执行appear方法中的代码(如果是viewDidLoad方法,则只会在加载nib时执行)。

转载于:https://www.cnblogs.com/xiaonanxia/archive/2013/03/30/2991021.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

120xa正反转参数_你知道变频器的“正反转死区时间”吗?它的“停机方式”有几种?...

若你我之间有缘,关注作者又何妨?两情若是久长时,又岂在朝朝暮暮。大家好!我是江郎,一个踏踏实实的维修工。本期我们仍然探讨两个问题,如标题所述,#变频器#“死区时间”和“停机方式”&#xff0…

【转】游戏编程中的人工智能技术--神经网络

原文:http://blog.csdn.net/ecitnet/article/details/1799444 游戏编程中的人工智能技术.>. (连载之一)用平常语言介绍神经网络(Neural Networks in Plain English)因为我们没有很好了解大脑,我们经常试图用最新的技术作为一种模型来解释它。在我童年…

w8计算机配置要求,win8系统最低配置要求有哪些|win8系统是否有最低配置要求-系统城...

2013-10-17 17:08:08  浏览量:5753小编这里要为大家带来的是win8系统最低配置要求和部分安装截图,很多用户想要将自己的电脑装上win8,但也不是每一台电脑都可以安装win8系统的,为了避免一些低配置的用户安装了win8之后却无法运行…

Session 丢失问题

项目从.NET Framework3.5 升级 .NET Framework4.0后,如果用Response.Redirect();进行页面的跳转,服务端会把这个跳转动作当作是一个“新”的用户去访问网页。 而这个时候,会给这个“新”的用户一个SessionID,那造成的结果是&#…

财务管理专业应该报计算机二级哪个科目,我是应该报计算机二级还是三级呢

2008-12-01怎样学好财务管理?“五步”学好财务管理:学习这门课程前,首先就不要认为它“很难”,只要相信“难而不会,会而不难”,充满信心一定就能学好。我在学习过程中总结了几条经验,以供各位学友参考&…

libsvm java 调用说明

libsvm是著名的SVM开源组件,目前有JAVA.C/C,.NET 等多个版本,本人使用的是2.9libsvm命名空间下主要使用类:svm_model 为模型类,通过训练或加载训练好的模型文件获得svm_parameter 为参数类,主要为支持向量机设定参数&a…

java字符串排序_对字符串排序持一种宽容的心态

在Java中一涉及中文处理就会冒出很多问题来,其中排序也是一个让人头疼的课题,我们来看下面的代码:上面的代码定义一个数组,然后进行升序排序,我们期望的结果是按照拼音升序排列,即为李四、王五、张三&#…

rails开发随手记-0

helper默认是只在view中可用的,如果在controller中也要使用,要在ApplicationController中 include 如果model中如果有叫做type的列的话,会触发rails的Single Table Inheritance ,放弃它吧,不好用,还是安心使…

nagios 监控配置介绍(二)

#配置服务端监控客户端[rootnagios etc]# cd objects/[rootnagios objects]# vi hosts.cfg# Define a host for the local machinedefine host{use linux-serverhost_name 1.3-sambaalias 1.3-sambaaddress …

spoj SUBLEX (Lexicographical Substring Search) RE的欢迎来看看

SPOJ.com - Problem SUBLEX 这么裸的一个SAM,放在了死破OJ上面就是个坑。 注意用SAM做的时候输出要用一个数组存下来,然后再puts,不然一个一个字符输出会更慢。 还有一个就是不要多数据输入,估计最后多了几个没用的数字&#xff0…

mt4双线macd_3年内从亏损90多万到获利近760万,我只坚持我的:60分钟MACD双回拉战法!附选股公式...

MACD指标被普遍认为是最经典实用的技术指标之一。其实并不是因为MACD有多么精妙的算法,而是MACD遵循了最基本的“均线指导原则”,形象的将经典双均线系统换了一种更加直观的表达方式。在MT4中,默认应用的是单线MACD指标,而在证券市…

计算机专业书籍速读方法,格式你玩的转?速读5分钟就懂

小编又接到了新问题,有小伙伴说自己64GB的U盘在电脑里格式化只能选ExFAT或者NTFS,不能选择FAT32,求小编解答,小编正好借着这个机会,说说现在电脑格式问题。如果你懒得读,↓↓↓最后一段有答案,如…

java项目打jar包

http://www.cnblogs.com/tianguook/archive/2012/03/14/2396335.html java项目打jar包分为2种情况: 一、java项目没有导入第三方jar包 这时候打包就比较简单: 1. 首先在Eclipse中打开项目, 右键点击项目,选择“Export”&#xff1…

第一天 :学习node.js

第一天 :学习node.js ① node.js环境配置 我学过的语言最简单的一门 直接百度就可以配置 ② 每个入门 的程序都是从helloworld开始 代码如下 : var httprequire(http); http.createServer(function(req,res){ res.writeHead(200,{content-type:text/htm…

c语言从入门到精通第四版电子书_C语言从入门到精通(吐血分享)4.pdf

C语言从入门到精通(吐血分享)4成功!结构体、链表、文件数组、字符串函数、指针三种结构化程序设计三种数据类型、六大表达式一、简单的程序#include 数学函数 命令行main() /*主函数*/{ /*左花括号,函数体的开始 */int a,b,c; /*定义语句*/a 3; /*执行语…

从硬盘上把数据传回到计算机称为什么,计算机基础知识 第一章 习题三

计算机基础知识第一章习题三一、填空题1. 高级语言不能直接被计算机识别并执行,必须翻译成机器语言,翻译的方式有两种:一种是编译方式,另一种是方式。2. 计算机中存储数据的最小单位是;存储容量的基本单位是。3. CAI的…

Mentor PADS 9.5下载安装及破解指南

Pads,是一款用于设计、模拟电子线路及设计电路板的电脑软件,原由Innoveda公司开发,其后改名为PowerPCB,在2002年4月Innoveda被Mentor Graphics收购,近年再次改用原名Pads。目前该软件是国内从事电路设计的工程师和技术…

Thymeleaf 学习笔记 (4)~~~~

2019独角兽企业重金招聘Python工程师标准>>> 模板布局 模板布局主要用到的标记有这么几个: th:fragment ,用来定义片段的,用法:th:fragment"fragmentName",起一个名字方便被其他地方引用&#xf…

凭证 金蝶_金蝶软件账务处理流程之——凭证录入

金蝶是我们财务人非常熟悉的财务软件,但是我们很多财务人只在应用软件的时候还是会出现很多的问题,为了帮助大家更好地应用这个软件,小编今天就来和大家讲讲关于金蝶软件凭证查询环节的一些基本处理流程。点击主界面“凭证查询”→弹出凭证过…