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.pswp.cn/news/259895.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259895.shtml
英文地址,請注明出處:http://en.pswp.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…

憑證 金蝶_金蝶軟件賬務處理流程之——憑證錄入

金蝶是我們財務人非常熟悉的財務軟件,但是我們很多財務人只在應用軟件的時候還是會出現很多的問題,為了幫助大家更好地應用這個軟件,小編今天就來和大家講講關于金蝶軟件憑證查詢環節的一些基本處理流程。點擊主界面“憑證查詢”→彈出憑證過…