日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

initWithNibName/awakeFromNib/initWithCoder

發(fā)布時間:2025/4/16 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 initWithNibName/awakeFromNib/initWithCoder 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

每個ios開發(fā)者對loadView和viewDidLoad肯定都很熟悉,雖然這兩個函數(shù)使用上真的是非常簡單,但是和類似的initWithNibName/awakeFromNib/initWithCoder放在一起還是非常容易讓人混淆的.

昨天看了下蘋果官方的相關(guān)文檔以及幾篇相關(guān)內(nèi)容的網(wǎng)頁(一 二 三),其實這個內(nèi)容以前也看過,似乎也搞清楚了,可還是忘了.好急性不如爛筆頭,這次一定要好好記下來.
大前提是UIViewController有一個UIView.同時,需要厘清兩個概念,創(chuàng)建一個類和實例化一個類.在XCode中創(chuàng)建一個類和實例化一個類很容易區(qū)分,但是在IB(Interface Builder)中有時候就會迷糊.其實也很好區(qū)分,孤零零地創(chuàng)建了一個nib文件,沒有和其他可被實例化的類有直接或間接關(guān)系的時候,這個類或這些類(一個nib文件俺也可能包含多個類)是沒有機會被實例化的,所以這種情況只是通過ib創(chuàng)建了一個類,而沒有實例化.真正的實例化還需要通過在Xcode用代碼來讀取這個nib文件.知道這兩這的區(qū)別后這些方法也就容易辨認(rèn)多了
viewDidLoad其實沒什么可混淆的,無論通過什么途徑加載(Xcode或者IB,這里的加載屬于實例化)完view后肯定會執(zhí)行這個方法.
loadView需要分兩種情況.當(dāng)你通過Xcode實例化一個類的時候就需要自己在controller中實現(xiàn)這個方法.而在IB中實例化就不需要實現(xiàn)它.
initWithNibName這個方法是在controller的類在IB中創(chuàng)建,但是通過Xcode實例化controller的時候用的.
awakeFromNib這個方法是一個類在IB中被實例化是被調(diào)用的.看了帖子發(fā)現(xiàn)大家都推薦使用viewDidLoad而不要使用awakeFromNib,應(yīng)為viewDidLoad會被多次調(diào)用,而awakeFromNib只會當(dāng)從nib文件中unarchive的時候才會被調(diào)用一次.實際測試中發(fā)現(xiàn),當(dāng)一個類的awakeFromNib被調(diào)用的時候,那么這個類的viewDidLoad就不會被調(diào)用了,這個感覺很奇怪.
initWithCoder是一個類在IB中創(chuàng)建但在xocdde中被實例化時被調(diào)用的.比如,通過IB創(chuàng)建一個controller的nib文件,然后在xocde中通過initWithNibName來實例化這個controller,那么這個controller的initWithCoder會被調(diào)用.

如果你的對象是UIViewControler的子類,那么你必須調(diào)用- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil;方法去調(diào)用NIB文件初始化自身,即使那沒有使用nib文件也會調(diào)用這個函數(shù)(默認(rèn)情況下init方法已經(jīng)為你的做這件事情了),如果你調(diào)用這個方法,并傳遞的兩個參數(shù)為空(nil),然后類會調(diào)用-loadView去讀取一個名字和你的UIViewController名字相同的nib文件,來初始化自身。如果沒有這樣的nib文件,你必須調(diào)用-setView:來設(shè)置一個self.view。或者重載-loadView 方法。


轉(zhuǎn)載于:https://my.oschina.net/fadoudou/blog/479680

總結(jié)

以上是生活随笔為你收集整理的initWithNibName/awakeFromNib/initWithCoder的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。