一个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.view addSubview:label];
...
}
returnself;
}
在if语句中,包含了最常见的成员初始化代码。
在这段代码中,如果你向ViewController的视图树中加入一些新的UIView子类,比如上面的代码:
[self.view addSubview: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时执行)。
相关推荐
浅论英语学习浅论英语学习浅论英语学习浅论英语学习浅论英语学习浅论英语学习浅论英语学习
计算机技术在计算机应用技术中的应用已经渗透到各个领域,包括科学计算、信息管理、辅助设计、教育、电子商务、人工智能和网络通信。计算机作为20世纪的创新工具,其科学内涵涵盖了计算机理论、组织架构、硬件、软件...
浅论我国饮食文化的地域差异-论文.zip
浅论软件需求分析.pdf
让星星火炬亮起来——浅论少先队活动课程的开发与探索.doc
知识产权浅论.doc
浅论《美的历程》
【档案信息化管理的重要性】 随着社会活动的多元化和信息量的爆炸式增长,传统的档案管理模式已经无法满足现代信息社会的需求。档案信息化管理成为了档案事业发展的必然趋势,它对于改善档案管理工作至关重要。...
### 浅论C/S和B/S体系结构:深入解析与对比 #### 一、引言:信息技术的演变与体系结构的重要性 在信息技术日新月异的当下,C/S(Client/Server,客户机/服务器)和B/S(Browser/Server,浏览器/服务器)体系结构...
随着技术的迅猛发展,区块链技术不仅在民间出现了“币圈”打法,而且在传统金融机构和其他行业中也出现了“链圈”打法。在这两种应用模式中,区块链的可运维性成为了一个不可忽视的重要议题。 ...
建筑行业是一个资源和能源消耗高,环境污染重的行业,而以牺牲环境、生态和可持续发展为代价的传统建筑逐渐被淘汰,"绿色建筑"从最初简单的概念迅速向实际应用发展,各种环保节能的新技术、新产品也越来越成熟,能否把...
浅论C语言实验教学改革
浅论美剧嵌入式营销.doc
浅论对外贸易拓展.pdf
(19-终)03-06浅论新时代基层行政管理中的依法行政问题及对策——以z市为例.doc
浅论独立董事制度.pdf
浅论人事行政改革.docx
浅论资本比率评估.doc
浅论电子货币影响.doc