視圖的生命歷程
1. -[ViewController initWithCoder:]或-[ViewController initWithNibName:Bundle]:首先從歸檔文件中加載UIViewController對象。即使是純代碼,也會把nil作為參數傳給后者。
2. -[UIView awakeFromNib]:作為第一個方法的助手,方便處理一些額外的設置。
3. -[ViewController loadView]:創建或加載一個view并把它賦值給UIViewController的view屬性
4. -[ViewController viewDidLoad]:此時整個視圖層次(view hierarchy)已經被放到內存中,可以移除一些視圖,修改約束,加載數據等
5. -[ViewController viewWillAppear:]:視圖加載完成,并即將顯示在屏幕上,還沒有設置動畫,可以改變當前屏幕方向或狀態欄的風格等。
6. -[ViewController viewWillLayoutSubviews]:即將開始子視圖位置布局
7. -[ViewController viewDidLayoutSubviews]:用于通知視圖的位置布局已經完成
8. -[ViewController viewDidAppear:]:視圖已經展示在屏幕上,可以對視圖做一些關于展示效果方面的修改。
9. -[ViewController viewWillDisappear:]:視圖即將消失
10. -[ViewController viewDidDisappear:]:視圖已經消失
如果考慮UIViewController可能在某個時刻釋放整個view。那么再次加載視圖時顯然會從步驟3開始。因為此時的UIViewController對象依然存在。
總結
- 只有init系列的方法,如initWithNibName需要自己調用,其他方法如loadView和awakeFromNib則是系統自動調用。而viewWill/Did系列的方法則類似于回調和通知,也會被自動調用。
- 純代碼寫視圖布局時需要注意,要手動調用loadView方法,而且不要調用父類的loadView方法。純代碼和用IB的區別僅存在于loadView方法及其之前,編程時需要注意的也就是loadView方法。
- 除了initWithNibName和awakeFromNib方法是處理視圖控制器外,其他方法都是處理視圖。這兩個方法在視圖控制器的生命周期里只會調用一次。