![](/img/trans.png)
[英]Calling a method from a different viewController won't call viewDidLoad of viewWillAppear methods
[英]About viewController's “viewDidLoad” and “viewWillAppear” methods
我對這兩個提到的方法有一個問題,因為在我的測試中我沒有明確它們被稱為的順序。 我認為,首先,當viewController第一次加載時(如名稱所示),並且在init方法之后立即調用viewDidLoad
。 然后,我認為一旦viewDidLoad
返回,就會調用viewWillAppear
。 如果你顯示另一個viewController,然后你返回到這個,那么它應該已經加載,只會調用viewWillAppear
。
然而,在開發過程中我給人的印象是在調用viewDidLoad
和viewWillAppear
時沒有順序...我在Apple的文檔中找不到這個生命周期的清晰描述,這實際上是如何工作的?
謝謝!
我想補充Caleb的答案:不要混淆視圖控制器和視圖! 名稱viewDidLoad
清楚地表明在加載視圖后調用該方法。 它是視圖控制器進行加載。
關於視圖生命周期和消息發送順序的一些指示:
UIViewController
的生命周期覆蓋。 loadView
和viewDidLoad
,也與故事板結合使用。 viewWillAppear:
et al) 我在這里停下來。 您可以通過Google搜索“uiviewcontroller生命周期”找到更多自己的東西。
-viewDidLoad
在控制器加載其視圖時被調用,這在初始化之后不一定正確。 視圖控制器在需要它們之前不會加載它們的視圖,無論是顯示還是出於任何其他原因。
-viewWillAppear
在顯示視圖之前調用。 這將是在-viewDidLoad
之后,但你-viewDidLoad
知道多久之后。 每次顯示視圖時都會調用-viewWillAppear
; -viewDidLoad
如果視圖在某些點(如卸載將只稱為第二時間didReceiveMemoryWarning )。 這些日子不尋常,但它可能發生。
或者,如果viewController設置為nil
,這通常會在視圖控制器從導航堆棧中啟動時發生,因此下次將其帶到導航堆棧時,需要再次調用-viewDidLoad
。
我認為,首先,當viewController第一次加載時(如名稱所示),並且在init方法之后立即調用viewDidLoad
不。該名稱表示已加載控制器的view
(不是控制器本身)。 實際上,文檔聲明在將視圖層次結構加載到內存后(例如,通過loadView
或通過nib)將調用此方法。
然后,我認為一旦viewDidLoad返回,就會調用viewWillAppear
再一次,沒有。 loadView
(以及因此viewDidLoad
)方法將在第一次訪問view
屬性時被調用,並且是nil
(初始化控制器時就是這種情況)。 想想這個簡單的場景:
MyViewController *vc = [[MyViewController alloc] init];
UIView *view = vc.view; // <= loadView & viewDidLoad will fire but it certainly didn't appear...
但是,在開發過程中,我認為在調用viewDidLoad和viewWillAppear時沒有順序......
好吧有訂單。 我們肯定知道viewWillAppear
將始終在viewDidLoad
之后調用(如果要同時調用它們兩者)。
正如您所說, ViewDidLoad僅在加載視圖后調用一次。 所以我們可以初始化viewDidLoad中的實例。 它主要用於初始化。
每當我們到達此視圖時, viewWillAppear都會調用。 因此,如果UI中有任何更改,我們可以在viewWillAppear中完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.