1. 程式人生 > >有關UIViewController與UIView的初始化建立

有關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函式來響應這個訊息,執行一些必要的操作。