ViewController的生命周期

設(shè)置rootVC

在AppDelegate中

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // 設(shè)置rootViewController
        self.window = UIWindow.init()
        let naviVC = UINavigationController.init(rootViewController: ViewController())
        self.window?.rootViewController = naviVC
        return true
    }

init

如果通過xib或storyboard創(chuàng)建,會(huì)首先調(diào)用該方法

loadView

加載View,此時(shí)VC還未初始化,可以在這里替換默認(rèn)的View,若重寫邏輯,就不能調(diào)用[super loadView]。

viewDidLoad

在VC的生命周期中,只會(huì)被調(diào)用一次。此時(shí)view已經(jīng)初始化好,可以做一些頁面初始化任務(wù),由于此時(shí)view的bounds尚未確定,所以不適合寫frame類型的布局代碼,但是給視圖添加約束沒有影響。
重寫該方法來配置在xib或storyboard中沒有配置的東西。
當(dāng)VC當(dāng)視圖層從xib或storyboard中被加載到內(nèi)存中的時(shí)候,該方法也會(huì)被調(diào)用。
當(dāng)ViewDidLoad被調(diào)用的時(shí)候,IBQutlets已經(jīng)被連接,但是View還沒有被加載出來,所以可以在viewDidLoad中完成在IB中不能完成的view的自定義。
注意:當(dāng)viewController在navigation堆棧中,從此界面跳轉(zhuǎn)到其他界面,再返回過來,不會(huì)再走ViewDidLoad方法,所以不能把需要在VC準(zhǔn)備變?yōu)榛钴S狀態(tài)的時(shí)候做相應(yīng)更新的代碼放在這里。

viewWillAppear

VC的視圖將要出現(xiàn)時(shí)調(diào)用,可能會(huì)調(diào)用多次,適合做一些與視圖相關(guān)聯(lián)的任務(wù),適合做一些與視圖出現(xiàn)相關(guān)聯(lián)的任務(wù),例如改變狀態(tài)欄的方向、風(fēng)格。

viewWillLayoutSubviews

ViewController的view的子視圖即將布局,觸發(fā)條件是

  • view 被添加到視圖層次中
  • view 的 bounds 發(fā)生了改變 ,view將調(diào)整其子控件的位置。
  • 調(diào)用了 - setNeedsLayout方法
  • 調(diào)用了 - layoutIfNeeded方法
    該方法默認(rèn)實(shí)現(xiàn)為空。調(diào)用時(shí),autolayout未起作用,在生命周期中可能會(huì)被多次調(diào)用。

viewDidLayoutSubviews

當(dāng) view 的子視圖已經(jīng)布局時(shí),此方法會(huì)被調(diào)用,觸發(fā)條件同上。
當(dāng)VC的子視圖的position和size被改變時(shí)被調(diào)用。
該方法默認(rèn)實(shí)現(xiàn)為空,此時(shí)AutoLayout已經(jīng)完成,在生命周期中可能會(huì)被多次調(diào)用。
在view 已經(jīng)被設(shè)計(jì)好了它的subviews并且還沒有被展示在屏幕上時(shí)候,可以調(diào)用此方法改變這個(gè)view。
關(guān)鍵點(diǎn)是改變bounds。任何依賴于bounds,并且需要去完成的操作都應(yīng)該放在viewDidLayoutSubviews中,而不是viewDidLoad或viewWillAppear中。
因?yàn)関iew的frame和bounds直到Auto Layout 已經(jīng)完成工作的時(shí)候才會(huì)被確定,所以在執(zhí)行完Auto Layout之后會(huì)調(diào)用此方法。

viewDidAppear

視圖從屏幕中出現(xiàn)后觸發(fā)。

viewWillDisappear

視圖即將從屏幕中消失時(shí)觸發(fā)。

viewDidDisappear

視圖從屏幕中消失后觸發(fā)。

多個(gè)ViewController跳轉(zhuǎn)

A push到 B

A loadView
A viewDidLoad
A viewWillAppear
A viewWillLayoutSubviews
A viewDidLayoutSubviews
A viewDidAppear
B loadView
B viewDidLoad
A viewWillDisappear
B viewWillAppear
B viewWillLayoutSubviews
B viewDidLayoutSubviews
A viewDidDisappear
B viewDidAppear

B pop到 A

B viewWillDisappear
A viewWillAppear
B viewDidDisappear
A viewDidAppear
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容