Objective c 出现内存警告后,UITabBarController中的视图消失
我有一个Objective c 出现内存警告后,UITabBarController中的视图消失,objective-c,ios,cocoa-touch,Objective C,Ios,Cocoa Touch,我有一个UINavigationController在uitabarcontroller的一个选项卡中 现在,我在整个应用程序上展示了一个新的视图控制器(我们称之为Steve)(使用presentViewController:animated:completion:) 然后,我模拟低内存 在解雇Steve之后(使用dismissViewControllerAnimated:completion:),我现在可以看到UINavigationController的视图消失了;在选项卡内;只看到一个空白
UINavigationController
在uitabarcontroller
的一个选项卡中
现在,我在整个应用程序上展示了一个新的视图控制器(我们称之为Steve)(使用presentViewController:animated:completion:
)
然后,我模拟低内存
在解雇Steve之后(使用dismissViewControllerAnimated:completion:
),我现在可以看到UINavigationController
的视图消失了;在选项卡内;只看到一个空白的白色区域
为什么会这样?史蒂夫被解雇后,我尝试在所有可以想象的控制器上调用视图
方法,但选项卡的内容仍然为空(白色)
奇怪的是:如果我单击另一个选项卡,然后单击原始选项卡上的上一步,内容(导航控制器)会再次显示良好。选项卡栏控制器是否正在执行某些特殊操作以强制显示视图
更新:在解雇史蒂夫之前,我用这段糟糕的代码“修复”了我的问题:
[[[[[self tabBarController] view] subviews] objectAtIndex:0]
addSubview:[[self navigationController] view]];
这样做的目的是找到不是选项卡栏的选项卡栏控制器的子视图(即俯视图),然后将导航控制器的视图添加为其子视图
这当然很糟糕,因为它对选项卡栏控制器视图的子视图结构进行了内部假设
如果有人有更好的解决方案,请告诉我。当您的应用程序收到内存警告时,它将做的第一件事是删除任何已加载视图但当前不可见的视图控制器(如您的
UINavigationController
)的视图层次结构。最有可能的情况是,位于导航堆栈顶部的任何视图控制器都会删除其视图,但在其重新出现时不会重新加载它们
始终将视图构造代码放在-loadView
或-viewDidLoad
中,而不是放在-init
中。这样,如果由于内存警告而删除视图,视图控制器将重建视图
(注:你的破解之所以有效,是因为你调用了
[[self-navigationController]view]
,这反过来又调用了堆栈顶部VC上的-loadView
,迫使它重构视图。)你检查了基类的ViewDiUnload方法了吗?可能有东西被删除或发布了。我还没有在任何地方实现任何卸载方法。(我用的是ARC)哦,好的。我会再看一遍。仅仅因为你使用ARC并不意味着你不需要卸载东西。我有同样的问题,但你的“修复”并没有解决它。仍在寻找解决方案…我尝试按您的暗示仅调用[[self-navigationController]视图]
,但没有任何效果。然而,我的黑客继续工作。我没有在任何init
方法中做任何特殊的事情。我在应用程序:didFinishLaunchingWithOptions:
中设置了视图层次结构(选项卡栏控制器及其导航控制器,以及出现在导航控制器中的表视图控制器)。基于这些新信息,您是否有进一步的想法?@Enchilada我所说的“视图层次结构”与其说是视图控制器结构,不如说是控制器中的视图。我需要查看您的表视图控制器代码——我之前的预感是,您是在视图控制器的init
方法中设置TVC的子视图,而不是在viewDidLoad
中。