2012-02-06 87 views
1

我在UITabBarController的其中一個選項卡內有UINavigationController在內存警告後,UITabBarController中的視圖消失

我現在在整個應用程序中使用一個新的視圖控制器(我們稱之爲Steve)(使用presentViewController:animated:completion:)。

然後,我模擬低內存。

解僱史蒂夫(使用dismissViewControllerAnimated:completion:)後,我現在可以看到UINavigationController的觀點已經消失;在標籤內;只有空的白色區域被看到!

這是爲什麼?在Steve被解僱時,我曾嘗試在所有可以想象的控制器上調用view方法,但該選項卡的內容仍保持空白(白色)。

奇怪的是這個:如果我點擊另一個選項卡,並在原始選項卡上單擊,內容(導航控制器)再次顯示爲正常。標籤欄控制器是否執行特殊的操作來強制顯示視圖?


更新:我能「解決」我的問題與這種可怕的代碼,只是解僱之前史蒂夫:

[[[[[self tabBarController] view] subviews] objectAtIndex:0] 
     addSubview:[[self navigationController] view]]; 

這樣做是它發現的標籤欄的子視圖控制器是而不是標籤欄(即頂視圖),然後將導航控制器的視圖添加爲其子視圖。

這當然很糟糕,因爲它會對標籤欄控制器視圖的子視圖結構進行內部假設。

如果有人有更好的解決方案,請讓我知道他們。

+0

你檢查viewDidUnload方法的基類?也許東西被刪除或在那裏發佈。 – cocoakomali 2012-02-06 18:02:44

+0

我沒有在任何地方實施任何卸載方法。 (我正在使用ARC。) – Enchilada 2012-02-06 18:55:50

+0

Oh k。然後,我將再次看穿它。 – cocoakomali 2012-02-06 19:03:03

回答

0

當您的應用程序收到內存警告時,首先會執行的操作之一是刪除已加載視圖但目前不可見的任何視圖控制器的視圖層次結構(如UINavigationController)。最有可能的是,無論視圖控制器位於導航堆棧的頂部,其視圖都會丟失,但在重新出現時不會重新加載它們。

始終把您的視圖建設代碼-loadView-viewDidLoad而不是-init。這樣,如果視圖控制器由於內存警告而被刪除,視圖控制器將重新構建視圖。

(PS:你的黑客成功運作的原因是你叫[[self navigationController] view],這反過來又在堆棧頂部的VC調用-loadView,迫使它重建其視圖位)。

+0

我曾試着僅僅調用'[[self navigationController] view]',但你沒有做任何事情。但是,我的黑客繼續工作。我沒有在任何'init'方法中做任何特殊的事情。我在'application:didFinishLaunchingWithOptions:'內設置了視圖層次結構(標籤欄控制器及其導航控制器,以及出現在導航控制器內的表格視圖控制器)。基於這些新的信息,你有沒有更多的想法? – Enchilada 2012-02-07 01:39:58

+0

@Enchilada我認爲「視圖層次」不是視圖控制器結構,而是控制器內的視圖。我需要查看你的表格視圖控制器代碼 - 我之前的預感是你在視圖控制器的init方法中設置了TVC的子視圖,而不是在viewDidLoad中。 – 2012-02-13 22:57:05

相關問題