視圖的生命歷程
1. -[ViewController initWithCoder:]或-[ViewController initWithNibName:Bundle]:首先從歸檔文件中加載UIViewController對象。即使是純代碼,也會把nil作為參數(shù)傳給后者界逛。
2. -[UIView awakeFromNib]:作為第一個方法的助手,方便處理一些額外的設(shè)置际插。
3. -[ViewController loadView]:創(chuàng)建或加載一個view并把它賦值給UIViewController的view屬性
4. -[ViewController viewDidLoad]:此時整個視圖層次(view hierarchy)已經(jīng)被放到內(nèi)存中哥艇,可以移除一些視圖,修改約束胁黑,加載數(shù)據(jù)等
5. -[ViewController viewWillAppear:]:視圖加載完成废封,并即將顯示在屏幕上,還沒有設(shè)置動畫,可以改變當(dāng)前屏幕方向或狀態(tài)欄的風(fēng)格等丧蘸。
6. -[ViewController viewWillLayoutSubviews]:即將開始子視圖位置布局
7. -[ViewController viewDidLayoutSubviews]:用于通知視圖的位置布局已經(jīng)完成
8. -[ViewController viewDidAppear:]:視圖已經(jīng)展示在屏幕上漂洋,可以對視圖做一些關(guān)于展示效果方面的修改。
9. -[ViewController viewWillDisappear:]:視圖即將消失
10. -[ViewController viewDidDisappear:]:視圖已經(jīng)消失
如果考慮UIViewController可能在某個時刻釋放整個view力喷。那么再次加載視圖時顯然會從步驟3開始刽漂。因為此時的UIViewController對象依然存在。
總結(jié)
- 只有init系列的方法,如initWithNibName需要自己調(diào)用弟孟,其他方法如loadView和awakeFromNib則是系統(tǒng)自動調(diào)用贝咙。而viewWill/Did系列的方法則類似于回調(diào)和通知,也會被自動調(diào)用拂募。
- 純代碼寫視圖布局時需要注意庭猩,要手動調(diào)用loadView方法,而且不要調(diào)用父類的loadView方法陈症。純代碼和用IB的區(qū)別僅存在于loadView方法及其之前蔼水,編程時需要注意的也就是loadView方法。
- 除了initWithNibName和awakeFromNib方法是處理視圖控制器外录肯,其他方法都是處理視圖趴腋。這兩個方法在視圖控制器的生命周期里只會調(diào)用一次。