2013-03-11 42 views
8

我有疑問需要清楚..我有堆棧和導航控制器。現在當堆棧加載viewDidLoadviewWillAppearviewDidAppear將被調用。當我點擊一些按鈕,然後這個按鈕把我推到新的堆棧,現在新的堆棧給了我後面的選項..現在,當我點擊導航控制器的背面..爲什麼只有viewWillAppear將被稱爲..爲什麼不viewDidLoad而不是viewDidAppear爲什麼只有viewWillAppear調用導航回

+0

viewDidAppear必須被調用。嘗試把NSLog,而不是如果你正在檢查斷點 – 2013-03-11 05:48:43

+1

'viewDidAppear'總是被我的應用程序調用。確保在你調用'[super viewWillAppear:animated]''的'viewWillAppear:'方法中。也可以在其他方法中調用正確的[super xxx]。 – rmaddy 2013-03-11 05:53:32

回答

15

棧是後進先出(LIFO),所以當你將新的視圖控制器推送到堆棧時,以前的viewcontroller不會被銷燬(並且它們保留在內存中)。當您回彈時,無需重新創建Viewcontroller,因爲它已經在內存中。所以只有viewWillAppear被調用。

至於爲什麼viewDidAppear在這種情況下沒有被調用,我不記得我在哪裏讀過這個,但是當你的UIViewController的視圖被添加到應用程序的UIWindow層次後,viewDidAppear被調用。這個過程是在UIViewController第一次顯示之前完成的。

viewDidLoad只有當viewControllers視圖加載到內存中時纔會調用。因爲 是從內存中清除了一些低內存的原因時,需要顯示

  • 有時當的viewController需要重新裝入

    1. 第一次認爲它會做。

    在你的情況下,當你回彈的時候,viewController已經被加載了,所以不需要再次調用viewDidLoad

  • +0

    yaa ok我知道了......但爲什麼不'viewDidAppear'和'viewDidLoad' – Christien 2013-03-11 05:37:11

    +0

    @Christien請參閱編輯 – Krishnabhadra 2013-03-11 05:42:45

    +0

    好吧然後在你的情況下..'viewWillAppear'和'ViewDidAppear'應該被稱爲ryt ...但是' viewWillAppear'只叫'不叫'ViewDidAppear' – Christien 2013-03-11 05:51:23

    2

    我沒有一個完整的答案給你,但我希望這有助於。

    viewDidLoad是加載事件發生後修改視圖的回調函數。在你的情況下,視圖已經加載。它不在意的事實並不意味着它已從記憶中卸載。

    viewDidAppear:雖然我不知道爲什麼這個事件沒有發射,並且如果有其他人填補這個空白,會很開心。

    12

    ios ui的完整生命週期在這裏解釋。 enter image description here

    http://www.verydemo.com/demo_c134_i4568.html

    注意通過Abizern從評論:這是真實的的iOS5和更早版本。 iOS6不再卸載視圖。

    +2

    添加從哪裏得到這個屏幕截圖的參考:) – 2013-03-11 05:31:43

    +0

    亞,但沒有得到邏輯Ÿ只有'viewWillAppear'將被調用導航回...沒有其他 – Christien 2013-03-11 05:35:26

    +0

    因爲當你回到那個視圖控制器已經創建。 viewDidLoad只在已經創建的時候調用它纔會觸發。 ViewWill在每次屏幕顯示時都會調用。 – 2013-03-11 05:40:21

    3

    首先,很好的問題@ user2102546。在此處簽出您查詢的完美理由。

    viewDidLoad只有在視圖控制器的視圖被卸載並且需要重新加載時纔會被調用。

    通常情況下,如果您使用導航控制器,並使用其中一種彈出方法回到以前的視圖,則可使用viewDidLoad does not get called again, because the view are not unloaded yet

    然而,系統可以卸載任何視圖控制器的視圖,當視圖控制器不是最前面的時候,爲了釋放內存,所以viewDidLoad可以在視圖控制器即將呈現時隨時調用。您需要編寫代碼以正確響應不同的事件。

    享受編程!

    +0

    如果我們考慮Hasintha的上面的圖片和你的答案...'viewDidLoad不會被再次調用,因爲視圖還沒有被卸載.'罰款..'viewdidload不會稱爲未卸載,但viewWillAppear和ViewDidAppear都應該被稱爲' – Christien 2013-03-11 05:46:25

    +0

    @Christien,是的,這兩個viewWillAppear&ViewDidAppear,都將在導航返回時調用。 – 2013-03-11 05:53:28

    相關問題