2

我的项目中有一个非常奇怪的错误。我有一个UIScrollView主要的,大的观点。在它里面,我有一个UIViewController(not UITableViewController) ,它有一个UITableView实例变量,以及一些 miscellaneous UIButtons。我已将视图控制器的视图框架设置为CGRectMake(0, 64, 320, 388),因为它上方有一个标签栏(这还没有功能)。起初它工作得很好,看起来也很棒,但是一旦我呈现并关闭 a modalViewController(因此重新加载UIViewController,我相信),它会将UIViewController' 的视图推到屏幕顶部(默认情况下将其设置为CGRectMake(0, 0, 320, 460),但因为我已经设置wantsFullScreenLayoutNO,它现在将其设置为CGRectMake(0, 0, 320, 388)

我已经将此问题跟踪到 和 之间的某个viewWillAppear地方viewDidAppear。这是我解雇后的确切日志modalViewController

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

如您所见,框架在 中很好viewWillAppear,但在viewDidAppear.

我做了以下事情来尝试修复它: - 在、、和
中设置所需的框架。 - 将我的设置为. - 杀死我并调用我的方法覆盖。loadViewviewDidLoadviewWillAppearviewDidAppear
wantsFullScreenLayoutNO
[super viewWillAppear:][super viewDidAppear:]

我该怎么办?!?!?

4

1 回答 1

0

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

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

自定义 UIViewController 子类也可以充当容器视图控制器。容器视图控制器管理它拥有的其他视图控制器的内容呈现,也称为它的子视图控制器。子视图可以按原样呈现,也可以与容器视图控制器拥有的视图一起呈现。

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

Your container view controller must associate a child view controller with itself before adding the child’s root view to the view hierarchy. This allows iOS to properly route events to child view controllers and the views those controllers manage. Likewise, after it removes a child’s root view from its view hierarchy, it should disconnect that child view controller from itself. To make or break these associations, your container calls specific methods defined by the base class. These methods are not intended to be called by clients of your container class; they are to be used only by your container’s implementation to provide the expected containment behavior.

于 2011-11-18T16:25:46.920 回答