UIViewController调整自己viewWillAppear和viewDidAppear之间?

我的项目中有一个非常奇怪的错误。 我有一个UIScrollView作为我的主要观点。 在里面,我有一个UIViewController (而不是UITableViewController ),它有一个UITableView实例variables,以及一些杂项UIButtons 。 我已经把视图控制器的视图框架设置为CGRectMake(0, 64, 320, 388) ,因为我有一个标签栏上面(这是不是function呢)。 起初,它工作得很好,看起来不错,但一旦我提出和解雇一个modalViewController (因此重新加载UIViewController ,我相信),它推动UIViewController的视图到屏幕的顶部(默认设置为CGRectMake(0, 0, 320, 460) wantsFullScreenLayout CGRectMake(0, 0, 320, 460) ,但是因为我把wantsFullScreenLayout设置为NO ,所以现在将它设置为CGRectMake(0, 0, 320, 388)

我已经将这个问题追踪到viewWillAppearviewDidAppear之间的某处。 这是我的确切日志解散modalViewController

2011-05-06 11:08:39.974 Campus [1570:207] Frame是0.000000,64.000000,320.000000,388.000000(viewWillAppear)
2011-05-06 11:08:40.378 Campus [1570:207] Frame是0.000000,0.000000,320.000000,388.000000(viewDidAppear)

正如你所看到的, viewWillAppear的框架是好的,但不是viewDidAppear

我已经做了以下事情来尝试修复它:
– 在loadViewviewDidLoadviewWillAppearviewDidAppear设置所需的框架。
– 将我的wantsFullScreenLayout设置为NO
– 我的方法覆盖杀死了我的[super viewWillAppear:][super viewDidAppear:]调用。

我该怎么办?!?!?

我的问题是,从iOS 4开始,Apple只支持每个窗口1个视图控制器。 但是,从iOS 5开始,Apple增加了对容器视图控制器的支持,并为UIViewController添加了诸如addChildViewController: 。 使用容器视图控制器algorithm解决了我的问题。 访问UIViewController类参考了解更多信息。

编辑:对于那些懒得在类引用中search“容器视图控制器”的人,这里是类引用中相关部分的要点:

一个自定义的UIViewController子类也可以充当一个容器视图控制器。 容器视图控制器pipe理其拥有的其他视图控制器(也称为其子视图控制器)的内容的呈现。 孩子的视图可以按原样或与容器视图控制器拥有的视图一起呈现。

您的容器视图控制器子类应声明一个公共接口来关联其子级。 这些方法的本质取决于你,取决于你创build的容器的语义。 您需要决定您的视图控制器一次显示多less个子项,显示这些子项时以及在视图控制器的视图层次结构中显示的位置。 你的视图控制器类定义了什么关系,如果有的话,由孩子们共享。 通过为你的容器build立一个干净的公共接口,你可以确保孩子在逻辑上使用它的能力,而不用访问太多关于你的容器如何实现行为的私有细节。

在将子视图添加到视图层次结构之前,您的容器视图控制器必须将子视图控制器与其自身相关联。 这允许iOS将事件正确地路由到子视图控制器以及这些控制器pipe理的视图。 同样,在从其视图层次结构中删除一个孩子的根视图之后,它应该将该子视图控制器与其自身断开连接。 为了build立或closures这些关联,你的容器调用由基类定义的特定方法。 这些方法不打算由您的容器类的客户端调用; 它们只能在您的容器的实现中使用,以提供预期的控制行为。