結論
使用 UINavigationController pushViewController:animated: API 顯示的 UIViewController蓉冈,它的整個生命周期其實和 API 中傳遞的 animated 參數值有關
過程
讓我們來做個小 DEMO 實驗來驗證這個結論
首先我們的 DEMO 很簡單,只有兩個頁面鞋屈,ViewController 和 AnotherViewController
然后我們使用默認的 StoryBoard 的方式來構建我們的 App UI 界面,App 主 Window 的 RootViewController 是一個 UINavigationController锻弓,UINavigationController 的 RootViewController 是 ViewController
ViewController 上面有兩個按鈕扰她,兩個按鈕都綁定了跳轉到 AnotherViewController 的 Segue犹赖,只是一個有動畫,一個沒有動畫
接著我們在 AnotherViewController 里添加 UIViewController 整個生命周期內的各個函數代碼 Log 打點
運行 App
點擊“顯示頁面 B(有動畫)”按鈕后 Xcode 控制臺上打印如下:
和平常一樣董瞻,很正常寞蚌,沒什么好說的
但是當我們再點擊“顯示頁面 B(沒有動畫)”按鈕后 Xcode 控制臺上打印如下:
很明顯看到 loadViewIfNeeded 由之前的在 viewWillAppear: 之后調用提前到了 loadView 之前,并且 viewDidAppear: 和 viewWillLayoutSubviews钠糊、viewDidLayoutSubviews 之間的調用順序也改變了挟秤,viewDidAppear: 函數調用比 viewWillLayoutSubviews、viewDidLayoutSubviews 還早
彩蛋
在這過程中意外地發(fā)現抄伍,如果是沒有動畫顯示 AnotherViewController 的時候艘刚,斷點在 viewDidAppear:,可以看到其實這時候 AnotherViewController 根本還沒有顯示
結語
所以 viewDidAppear: 在整個 UIViewController 的生命周期中是否準確截珍,取決于 animated 這個參數值