iOS開發 深入了解控制器View的載入

2022-08-30 04:00:13 字數 2978 閱讀 5944

前言

在面試中,面試官可能會問這樣的問題,loadview有什麼作用,它與viewdidload有何區別

首先我們得知道,控制器view是通過懶載入的方式進行載入的,即用到的時候再載入。

loadview方法
當我們用到控制器view時,就會呼叫控制器view的get方法,在get方法內部,首先判斷view是否已經建立,如果已存在,則直接返回存在的view,如果不存在,則呼叫控制器的loadview方法,在控制器沒有被銷毀的情況下,loadview也可能會被執行多次

viewdidload方法
當控制器的loadview方法執行完畢,view被建立成功後,就會執行viewdidload方法,該方法與loadview方法一樣,也有可能被執行多次。在開發中,我們可能從未遇到過執行多次的情況,那什麼時候會執行多次呢?

比如a控制器push出b控制器,此時,視窗顯示的是b控制器的view,此時如果收到記憶體警告,我們一般會將a控制器中沒用的變數及view銷毀掉,之後當我們從b控制器pop到a控制器時,就會再次執行a控制器的loadview方法與viewdidload方法。

如下圖所示,注意控制台列印

控制器view的載入

先看一下demo的檔案結構,viewcontroller為a控制器,testviewcontroller為b控制器

1.通過storyboard載入

當控制器通過storyboard載入時,需要指定storyboard的名稱,控制器view最終就是storyboard所描述的樣子,這個比較簡單,不做詳細闡述

- (void)touchesbegan:(nsset*)touches withevent:(uievent *)event

2.通過xib載入

當控制器view通過xib載入的時候,可能會出現三種情況

a. 指定xib名稱(otherviewcontroller.xib)

- (void)touchesbegan:(nsset*)touches withevent:(uievent *)event

當我們指定了xib的名稱,loadview方法就會去載入對應的xib(otherviewcontroller.xib),最終是這個樣子的

b.不指定xib名稱1

- (void)touchesbegan:(nsset*)touches withevent:(uievent *)event

如果我們不指定xib名稱,loadview就會載入與控制器同名的xib(testviewcontroller.xib),最終是這個樣子的

c.不指定xib名稱2

我們先將testviewcontroller.xib這個檔案刪除掉,這個時候,我們再來執行程式,結果是這樣的

根據上圖我們可以得知,當沒有指定xib名稱,且沒有與控制器同名的xib時,會載入字首與控制器名相同而不帶controller的xib(testview.xib)。

3.不通過sb\xib載入

將testview.xib這個檔案也刪除掉,再來執行程式,結果是這樣的

這麼黑,難道沒有建立控制器view?

如上圖,控制器view是存在的,只不過顏色為clearcolor,所以看到的黑色其實是uiwindow的

4.重寫loadview方法

我們重寫testviewcontroller的loadview方法,裡面不做任何事

- (void

)loadview

執行程式看結果

結果跟上面一樣黑,不同的是,這次並沒有建立view,注意看上圖最外層並不是uiview

如果我們希望控制器view載入出來的時候不是uiview而是其他控制項,比如uiimageview,那我們就可以重寫loadview

- (void

)loadview

結論

1.重寫loadview方法,則會根據重寫的loadview方法建立view

2.控制器通過storyboard載入,則根據storyboard的描述建立view

3.控制器view通過xib載入,則根據nibname對應的xib建立view

4.沒有指定nibname,則根據與控制器同名的xib建立view

5.沒有同名的xib,則根據與控制器名字首相同不帶controller的xib建立view

6.如果都沒有,則建立乙個空白的xib

小細節

在上面的2、3兩點結論中,不知道大家有沒有乙個疑問

為什麼上面是說的控制器,而下面卻說的控制器view?

筆者結合控制器的awakefromnib方法給大家說明一下這個問題

顧名思義,當控制器從nib載入的時候就會呼叫這個方法

先來看看通過storyboard載入的情況

//

a控制器中**

- (void)touchesbegan:(nsset*)touches withevent:(uievent *)event

//b控制器中**

- (void

)awakefromnib

控制台列印了「b通過nib載入」,即呼叫了b控制器的awakefromnib方法

將之前刪除的testviewcontroller.xib檔案重寫新增進去,再來看通過xib載入的情況

1

//a控制器中**改為如下

2 - (void)touchesbegan:(nsset*)touches withevent:(uievent *)event6//

b控制器中**不變

控制台沒有任何輸出,即b控制器的awakefromnib方法並沒有被呼叫

結論

storyboard載入的是控制器及控制器view,而xib載入的僅僅只是控制器的view

ios開發控制器 UIViewController

大部分的控制器類都會繼承uikit的uiviewcontroller基類。該基類中的方法如下,通過重寫以下方法可以自定義需要實現的效果等,注意重寫該方法的時候需要呼叫 super 方法名 viewdidload 當該控制器管理的檢視被載入完成後,系統會自動呼叫該方法。didreceivememory...

深入了解Flutter介面開發

介面開發語言使用dart,底層渲染引擎使用c,c 組合大於繼承,控制項本身通常由許多小型 單用途的控制項組成,結合起來產生強大的效果,類的層次結構是扁平的,以最大化可能的組合數量 element 存放上下文,通過element遍歷檢視樹,element同時持有widget和renderobject ...

activemq深入了解 佇列模式手動控制消費

相信經過了解,基本使用activemq後,大家一定知道佇列裡面有ack模式,他的型別有以下幾種 1 auto acknowledge 1 自動確認 2 client acknowledge 2 客戶端手動確認 3 dups ok acknowledge 3 自動批量確認 4 session tran...