簡體   English   中英

關於viewController的“viewDidLoad”和“viewWillAppear”方法

[英]About viewController's “viewDidLoad” and “viewWillAppear” methods

我對這兩個提到的方法有一個問題,因為在我的測試中我沒有明確它們被稱為的順序。 我認為,首先,當viewController第一次加載時(如名稱所示),並且在init方法之后立即調用viewDidLoad 然后,我認為一旦viewDidLoad返回,就會調用viewWillAppear 如果你顯示另一個viewController,然后你返回到這個,那么它應該已經加載,只會調用viewWillAppear

然而,在開發過程中我給人的印象是在調用viewDidLoadviewWillAppear時沒有順序...我在Apple的文檔中找不到這個生命周期的清晰描述,這實際上是如何工作的?

謝謝!

我想補充Caleb的答案:不要混淆視圖控制器和視圖! 名稱viewDidLoad清楚地表明在加載視圖后調用該方法。 它是視圖控制器進行加載。

關於視圖生命周期和消息發送順序的一些指示:

  • 不是官方的Apple文檔,但我覺得這個圖非常有用,因為它包含了幾乎所有UIViewController的生命周期覆蓋。
  • 在Apple的“View Controller編程指南”的“視圖控制器中的資源管理 ”一節中,有一個流程圖,描述了最初如何加載視圖。 它解釋了loadViewviewDidLoad ,也與故事板結合使用。
  • Apple的“視圖控制器編程指南”中的響應與顯示相關的通知的部分解釋了如何響應出現和消失的視圖( viewWillAppear: et al)
  • 如果您計划實現容器視圖控制器: UIViewController類引用可以很好地概述子類需要如何發送消息。

我在這里停下來。 您可以通過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中完成。

所有這些調用的時間都跟蹤了: http//thecodist.com/article/ios_arc_storyboards_and_uiviewcontroller_trace

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM