我有一个主视图控制器,其中有两个其他视图控制器作为成员变量,代表主视图中的不同“选项卡”。当点击“标签”时,它们被隐藏并显示。所有这些都在一个nib文件中。
当我收到内存警告时,会调用viewdidunload并按预期转储视图。但是,它们永远不会重新创建,并且再也不会调用viewdidunload。主视图控制器连接到导航控制器。
是什么给出了?
答案 0 :(得分:0)
发生内存警告时,系统可能会卸载当时在屏幕上看不到的视图控制器视图。触发重新加载那些视图控制器视图的操作实际上是试图访问这些视图。换句话说,当执行一些访问viewController.view的代码时,如果该视图已被卸载,则重新加载。
实际上,这意味着您的卸载视图通常会在它们再次显示的位置自动重新加载。因此,在内存警告之后,使用选项卡控制器变体更改当前视图,您应该看到它已重新加载(如果确实已卸载)。
答案 1 :(得分:0)
我通过在内存警告上转储和重新加载相关的视图控制器来解决这个问题,但最初的原因仍然是个谜。
Viewdidappear也从未被调用过,我怀疑这与解释无关。
答案 2 :(得分:0)
如果您正在进行视图控制器控制,则必须始终管理视图控制器的外观和消失。
当视图控制器卸载其视图时,该视图的整个层次结构将被销毁,当然不会保存。重新加载该父视图时,将执行-loadView和-viewDidLoad代码以及外观方法。这些方法不会比你告诉他们做的更多。如果你没有在viewDidLoad中重建你孩子的视图层次结构,那么不要指望它们会神奇地重现。
容器控制器的工作是加载其子窗口(可见的窗口)的视图,并将它们布置在自己的视图中。