0

我在使用UITabBarController到UINavigationController的應用程序中更改了導航。即以前的解決方案(第1版)僅基於TabBarController - 4 ViewControllers(一個簡單的TableView,一個簡單的自定義視圖和一個具有多個疊加層的MapView)。第二個版本僅基於UINavigationController。使用NavigationController進行內存管理的視圖

在TabBarController的情況下,它很清晰,簡單,一切正常,尤其是MapView。我的意思是:MapView加載了一次(具有大量的疊加層),當我轉到另一個視圖並返回到MapView時,MapView仍然存在,疊加層已經加載並顯示(簡單檢查:MapView的viewDidLoad被調用每個應用程序運行一次,我有一些調試消息)。

現在我將導航邏輯更改爲UINavigationController。一切工作正常的第一次看 - 但:viewDidLoad(每個視圖)每次我導航到視圖時調用。特別是在MapView的情況下很煩人 - 每次都會執行疊加的加載,這需要一些時間,並且在某些情況下會導致應用程序崩潰。

OK,我的問題:

  1. 它是某種NavigationController的 「常見」 的行爲?

  2. 我可以改變這種行爲,所以viewDidLoad只會被調用一次嗎?

  3. 還有更多 - 我怎樣才能影響某些視圖的「顯示順序」?

我理解其中的邏輯可能更復雜,但我明白任何答案或暗示;)

一些相關的情況:

  • 的TabBar和導航控制器不結合。
  • 我使用故事板,segues是在UIB中設計的,沒有像我的代碼中的perfomSegue或prepareForSegue這樣的手動調用。一個按鈕會觸發MapView。
  • 我使用push segues。
  • 我也嘗試使用模態賽格,但沒有任何這種行爲的變化。
  • 任何viewDidUnload都不會在視圖中的縱向間調用。
  • 未收到內存警告。
  • 在模擬器和iPhone 4上都沒有測量到內存泄漏。
  • 我試圖構建一個非常簡單的臨時項目/應用程序,只關注導航。控制器和其他視圖沒有任何編碼,只是故事板。這是一樣的行爲。
  • 有一個問題,導致應用程序崩潰時,我快速和定期點擊導航按鈕和返回按鈕之間的一個視圖和MapView。在大多數情況下,當我在MapView完全顯示(即覆蓋圖)之前點擊後退按鈕時,應用程序崩潰。當我增加1秒時它是固定的。 viewDid中的延遲方法調用在MapView中消失。這是不公平的修復,我知道;)
+0

在分配導航控制器時分配導圖類之前檢查它是否爲零,如果沒有,則直接將其分配給導航控制器上的導圖類。 – prasad 2013-03-09 15:05:08

回答

3

一個UITabBarControllerUINavigationController是基於完全不同的範式。

UITabBarController旨在使每個選項卡上的UIViewController彼此獨立存在,供用戶選擇他們想要查看的內容。對於每個UIViewControllerviewDidLoad只被調用一次,因爲它旨在即使用戶切換到不同的選項卡,每個選項卡仍然存在於內存中。

UINavigationController是一個UIViewControllers的堆棧,其中每個都與上面的一個有關並且位於它下面。堆棧中頂部的UIViewController始終是用戶可見的。當UIViewController被推入堆棧時,它的viewDidLoad被調用,因爲它被加載到內存中。當頂部UIViewController從堆棧中取出時,它將從內存中卸載,並且viewDidUnload被調出(viewDidUnload在iOS6中被棄用,並且不會被調用,但控制器仍將從內存中轉儲)。這就是爲什麼viewDidLoad每當用戶將一個特定的UIViewController推到UINavigationController堆棧上時被調用。

+1

你有一個錯字 - ''viewDidUnload'在ios6中不推薦使用,而不是'-viewDidLoad' – 2013-03-09 14:59:04

+0

好的!現在是固定的。謝謝。 – 2013-03-09 15:01:05

+0

「,viewDidUnload被調用出來」不,它不會,在iOS 6之前.'只有當視圖被卸載時纔會調用viewDidUnload'。視圖僅在內存不足的情況下卸載。 99%的時間你永遠不會看到視圖被卸載。 – newacct 2013-03-10 07:03:20

相關問題