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

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

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

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

不知道怎么回事。我是否必须以某种方式告诉缓存的UIViewControllers方向/大小已更改或其他?

非常感谢

最佳答案

是的你可以。最佳地,您应该清除每个视图控制器在离开屏幕时所管理的视图。

只需将nil分配给要替换的视图控制器的view属性。这将释放该视图不使用的所有资源。作为一项额外的好处,每当您决定再次将特定的viw控制器再次摆在前面时,便会以适当的框架重新创建视图。

我还假设您要实现的是UIViewController的子类,它充当其他视图控制器的容器。就像是UITabController的同级兄弟,名为CWGridController或类似名称。注意,父视图控制器(您的子类)有责任根据需要调整其子视图控制器视图框架的大小。

创建容器视图控制器不是一件容易的事,Apple并没有完成对容器视图控制器的支持。您必须做一些事情,包括但不限于:


将所有方向更改呼叫转发给所有子视图控制器。
根据需要正确调用所有在子视图控制器上出现/消失的控件。


使它起作用的最后一部分是打破一些规则。除非他们知道其父级视图控制器,否则视图控制器的工作将非常糟糕,布局将是错误的,而模态视图控制器的行为会很奇怪。不幸的是,parentViewController是只读的,否则您会认为。无论如何,使用KVC设置它都可以解决大多数问题,并且当您提交到App Store时,Apple似乎并不反对:

[childViewController setValue:self forKey:@"parentViewController"];

关于iphone - 您可以缓存UIViewControllers吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4671364/

10-12 04:22