你可以缓存UIViewControllers吗?

时间:2011-01-12 16:42:38

标签: iphone ios uiview uiviewcontroller orientation

我有一个带有8个UIViewControllers的应用程序,它是从左/右/上/下导航。它们是在应用程序启动时创建的,并保存在NSArray中。其中只有1个被添加到视图树(addSubview :)中 - 其余的只是坐在缓存中,直到需要它们为止。

现在我遇到的问题是旋转到Landscape时。只有当前可见的视图会将bounds.size更改为Landscape。导航到下一个视图时,该视图仍然认为它在纵向中(但是包含的视图将全部显示在Landscape中)。

顺便说一下,应用程序的视图层次结构如下:UIWindow - >主要UIViewController - > 8个缓存的UIViewControllers中的1个。

例如: *改变方向: - 主要UIViewController.view.bounds.size = 480x300(OK) - 其中一个缓存的UIViewControllers view.bounds.size = 480x300(OK) *转到下一个视图: - 主要UIViewController.view.bounds.size = 480x300(OK), - 另一个缓存的UIViewControllers view.bounds.size = 320x460(??)

不知道最近发生了什么。我是否必须以某种方式告诉缓存的UIViewControllers方向/大小是否发生了变化?

非常感谢

2 个答案:

答案 0 :(得分:2)

是的,你可以。最理想的是,您应该清除每个视图控制器在屏幕关闭时管理的视图。

只需将nil分配给正在替换的视图控制器的view属性即可。这将释放视图使用的所有资源,无论如何都是不可见的。作为额外的奖励,每当您决定再次在前面使用特定的viw控制器时,视图就会使用适当的帧重新创建。

我还假设您正在实现的是UIViewController的子类,它充当其他视图控制器的容器。就像名为UITabController的{​​{1}}或类似的兄弟姐妹一样。 Noe,父视图控制器(您的子类)负责根据需要调整其子视图控制器视图的框架。

创建容器视图控制器不是一项小任务,Apple的支持并不完整。您必须做一些事情,包括但不限于:

  • 将所有方向更改调用转发给所有子视图控制器。
  • 根据需要正确调用所有在子视图控制器上显示/消失的内容。

使其发挥作用的最后一部分是打破一些规则。视图控制器工作非常糟糕,除非他们知道他们的父视图控制器,布局将是错误的,模态视图控制器行为奇怪。不幸的是CWGridController是只读的,或者你会想到。无论如何使用KVC设置它将解决大多数问题,当您提交到App Store时Apple似乎没有反对:

parentViewController

答案 1 :(得分:0)

在viewWillAppear中,您必须检查界面方向并相应地设置框架。