内存警告后,UITabBarController中的视图消失

时间:2012-02-06 17:53:18

标签: objective-c ios cocoa-touch

我在UINavigationController的一个标签中有一个UITabBarController

我现在在整个应用程序上呈现一个新的视图控制器(让我们称之为Steve)(使用presentViewController:animated:completion:)。

然后,我模拟低内存。

在解雇史蒂夫(使用dismissViewControllerAnimated:completion:)之后,我现在可以看到UINavigationController的观点已经消失;标签内;只看到空白区域!

这是为什么?在史蒂夫被解雇后,我尝试在所有可以想象的控制器上调用view方法,但是标签的内容仍然是空的(白色)。

奇怪的是这个:如果我点击另一个标签,然后单击原始标签上的内容,则内容(导航控制器)再次显示正常。标签栏控制器是否执行某些特殊操作以强制显示视图?


更新:在解雇史蒂夫之前,我能够用这个可怕的代码“解决”我的问题:

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

它的作用是找到标签栏控制器的子视图标签栏(即顶视图),然后将导航控制器的视图添加为其子视图。< / p>

这当然很糟糕,因为它对标签栏控制器视图的子视图结构做出了内部假设。

如果有人有更好的解决方案,请告诉我们。

1 个答案:

答案 0 :(得分:0)

当您的应用收到内存警告时,它首先要做的就是删除已加载视图但当前不可见的任何视图控制器的视图层次结构(如UINavigationController)。最有可能的是,无论哪个视图控制器位于导航堆栈的顶部,都会丢弃其视图,但在重新出现时不会重新加载它们。

始终将您的视图构建代码放在-loadView-viewDidLoad中,而不是-init中。这样,视图控制器将重建您的视图,如果它由于内存警告而被删除。

(PS:您的黑客工作的原因是您调用[[self navigationController] view]的位置,而-loadView又调用堆栈顶部VC上的{{1}},迫使其重建其视图。)