1. 程式人生 > >iOS中ViewController載入View的幾種方式

iOS中ViewController載入View的幾種方式

ViewController 載入 View 的方式有:

  • 建立 ViewController 的同時載入 View,此種方式可分別通過載入關聯1了 VC 的 xib,或純程式碼建立實現。相關的呼叫方法有:

    • init
      載入關聯了 VC 的 xib,或者純程式碼建立皆可。此方法在UIViewController的載入的順序是:

      1. initWithNibName:bundle:
      2. init
      3. loadView
      4. viewDidLoad
    • initWithNibName:bundle:
      載入關聯了 VC 的 xib。此方法不會立即載入 View,所以使用時對 View 的額外操作應該在 viewDidLoad

      中進行。此方法在UIViewController的載入的順序是:

      1. initWithNibName:bundle:
      2. loadView
      3. viewDidLoad
    • loadView
      該方法是載入 View 時預設實現的,不允許直接呼叫,子類可重寫。實現過程是:在Bundle裡搜尋與被建立的ViewController相同類名的xib檔案,搜尋到了就載入此xib(xib必須與被建立的ViewController關聯),沒有搜尋到就建立一個“plain view”作為 ViewController’s view。

      注意:如果子類重寫該方法,則不會自動去搜索並載入xib。所以如果使用init 方法建立VC,並載入關聯了該 VC 的 xib 時,子類不要重寫,否則此xib將不會被載入,檢視漆黑。

  • 直接建立載入 View。此種方式可分別通過載入 xib(可不關聯VC),或純程式碼建立實現。相關的呼叫方法有:

    • init
      此方法在 UIView 的載入的順序是:

      1. init
      2. initWithFrame:
    • initWithFrame:
      此方法在 UIView 的載入時只實現本身。

    • loadNibNamed:owner:options:
      載入 xib,預設xib的 File’s owner是NSObject,返回的是一個數組。
      若 xib 中 File’s owner 關聯了其它類,則引數owner應該是該類例項物件;反之,則任何一個NSObject類或其子類的例項物件皆可。
      若 xib 中 View 不關聯其它類,則僅僅只是獲取載入View,不會觸發UIView的方法;若關聯了非UIView的類,不會觸發UIView的方法,同時會顯示臺列印提示”Unknown class xxx in Interface Builder file.”;若關聯了UIView或其子類,此方法在 UIView 的載入的順序是:

      1. initWithCoder:
      2. awakeFromNib:

      需要注意的是:在UIViewController的 viewDidLoad 中,一個使用此方法建立的 subView,設定frame,並新增到VC的檢視時,若VC也是用xib建立並載入,此時VC檢視在 viewDidLoad 中大小是xib中顯示的大小,但在 viewWillAppear: 中顯示的是另一個大小(除非當前手機螢幕大小剛好等於 xib 的檢視的大小),這種情況下在介面上實際顯示的效果會出錯。解決此問題的辦法是 vc.view.autoresizesSubviews = NO

    • initWithCoder:
      此方法是通過 unarchiver 獲取 xib 中的所有物件。

    • awakeFromNib:
      此方法是在 unarchiver 成功後,開始載入View,此方法可對一些控制元件進行額外的配置。

  1. xib關聯ViewController的流程:在xib檔案中,點選 File’s owner,在 Xcode 右側檢查器中“show the identity inspector”下選擇“class”,寫上要關聯的ViewController類名,最後右擊 File’s owner,拉線和 View 關聯即可。