iOS中ViewController載入View的幾種方式
ViewController 載入 View 的方式有:
建立 ViewController 的同時載入 View,此種方式可分別通過載入關聯1了 VC 的 xib,或純程式碼建立實現。相關的呼叫方法有:
init
載入關聯了 VC 的 xib,或者純程式碼建立皆可。此方法在UIViewController的載入的順序是:initWithNibName:bundle:
init
loadView
viewDidLoad
initWithNibName:bundle:
載入關聯了 VC 的 xib。此方法不會立即載入 View,所以使用時對 View 的額外操作應該在viewDidLoad
initWithNibName:bundle:
loadView
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 的載入的順序是:init
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 的載入的順序是:initWithCoder:
awakeFromNib:
需要注意的是:在UIViewController的
viewDidLoad
中,一個使用此方法建立的 subView,設定frame,並新增到VC的檢視時,若VC也是用xib建立並載入,此時VC檢視在viewDidLoad
中大小是xib中顯示的大小,但在viewWillAppear:
中顯示的是另一個大小(除非當前手機螢幕大小剛好等於 xib 的檢視的大小),這種情況下在介面上實際顯示的效果會出錯。解決此問題的辦法是vc.view.autoresizesSubviews = NO
initWithCoder:
此方法是通過 unarchiver 獲取 xib 中的所有物件。awakeFromNib:
此方法是在 unarchiver 成功後,開始載入View,此方法可對一些控制元件進行額外的配置。
- xib關聯ViewController的流程:在xib檔案中,點選 File’s owner,在 Xcode 右側檢查器中“show the identity inspector”下選擇“class”,寫上要關聯的ViewController類名,最後右擊 File’s owner,拉線和 View 關聯即可。 ↩