有關UIViewController與UIView的初始化建立
UIViewController
分為下面三種情形建立 (依次呼叫的方法 順序如下)
一.StoryBoard: 1.initWithCoder ; 2.awakeFromNib ; 3.loadView ; 4.viewDidLoad
二.Xib: 1.init ; 2.initWithNibName ; 3.loadView ; 4.viewDidLoad
三.純程式碼: 1.init ; 2.initWithNibName ; 3.loadView ; 4.viewDidLoad
UIView
分為下面三種情形建立 (依次呼叫的方法 順序如下)
一.StoryBoard: 1.initWithCoder ; 2.awakeFromNib
二.Xib: 1.initWithCoder ; 2.awakeFromNib
三.純程式碼: 1.init ; 2.initWithFrame
說明:1)awakeFromNib和initWithCoder:差別
awakeFromNib 從xib或者storyboard載入完畢就會呼叫
initWithCoder: 只要物件是從檔案解析來的,就會呼叫
同時存在會先呼叫initWithCoder:
2)initWithCoder: & initWithFrame:
initWithCoder:使用檔案載入的物件呼叫(如從xib或storyBoard中建立)
initWithFrame:使用程式碼載入的物件呼叫(使用純程式碼建立)
注意:所以為了同時兼顧從檔案和從程式碼解析的物件初始化,要同時在initWithCoder: 和 initWithFrame: 中進行初始化
3),無論XIB還是程式碼建立都會呼叫loadView方法。self.view為nil時才會被呼叫。
手工建立檢視時,loadView被呼叫時self.view還為nil。一般在該方法中手工定製view。
XIB建立檢視時,loadView仍會被呼叫、loadView被呼叫時XIB定製的檢視還沒建立完成,若是再覆寫該方法的話、會將XIB定製的檢視覆蓋掉。
所以,純手工定製檢視時,一般在該方法中寫;XIB定製檢視時、不要覆寫該方法。
4),無論XIB還是程式碼建立都會呼叫viewDidLoad方法。
手工建立檢視時,viewDidLoad被呼叫時self.view已經建立完成。可在在該方法中進一步定製檢視。
XIB建立檢視時,viewDidLoad仍會被呼叫,viewDidLoad被呼叫時self.view已經建立完成。可在在該方法中進一步定製檢視。
所以,無論那種方式定製檢視、都可以覆寫該方法。
5),一般情況下呼叫
init方法或者呼叫initWithNibName方法例項化UIViewController;當控制器被initWithNibName:並加入到導航控制器的棧中時,它不會載入nib檔案,直到nib檔案被實際顯示。因此控制器在nib檔案中定義的內容,例如label,可能還沒有例項化。此時label可能只是一個nil指標,需要額外使用程式碼中實現的屬性來儲存資訊。可以在
viewWillAppear:方法中對nib例項化的物件屬性進行設定
6),awakeFromNib此方法在使用IB的時候才會涉及到,當.nib檔案被載入的時候,會發送一個awakeFromNib的訊息到.nib檔案中的每個物件,每個物件都可以定義自己的awakeFromNib函式來響應這個訊息,執行一些必要的操作。