如何在视图控制器容器中显示第一个视图控制器

时间:2012-05-08 19:26:38

标签: ios5 uiviewcontroller uiviewanimation

我正在根据视图控制器上的iOS文档编写自定义视图控制器容器,我正在努力寻找一种优雅的方式来呈现第一个视图控制器,该控制器也会自动转发相关的显示消息,如viewWillAppear:。 / p>

当我使用transitionFromViewController:toViewController:duration:options:animations:completion:作为fromViewController: nil时,我会收到错误消息。我已经使用UIView动画块将视图设置为视图层次结构的动画。这似乎打破了外观方法的自动转发,这意味着我有责任在适当的时候致电viewWillAppear:ViewDidAppear:。有没有更有效的方法将第一个视图转换到负责外观和旋转方法的屏幕上?

我的代码在第一个视图控制器中看起来有点像动画。

self.visibleViewController = [[UIViewController alloc] init];
[self addChildViewController:self.visibleViewController];

[self.visibleViewController viewWillAppear:YES];
[self.visibleViewController.view setAlpha:0];
[self.view addSubview:self.visibleViewController.view];

[UIView animateWithDuration:0.5 
                      delay:0 
                    options:UIViewAnimationOptionCurveEaseOut 
                 animations:^{
                     self.visibleViewController.view.alpha = 1;
                 }
                 completion:^(BOOL finished){
                     [self.visibleViewController viewDidAppear];
                     [self.visibleViewController didMoveToParentViewController:self];
                 }];

2 个答案:

答案 0 :(得分:2)

答案就在那里一直隐藏在文档中。

UIViewController的文档是

- (void)beginAppearanceTransition:(BOOL)isAppearing animated:(BOOL)animated

和同伴

- (void)endAppearanceTransition

他们的文档说永远不要从你自己的代码中调用viewWillAppear等。你可以用这些方法正确地踢掉链条。

答案 1 :(得分:0)

您确定系统没有向您的子视图控制器发送viewWillAppear / viewDidAppear / DidMoveToParentViewController消息吗? Apple文档的这一点意味着它确实:

  

为了让iOS正确地将事件路由到子视图控制器   以及那些控制器管理的视图,容器视图控制器   必须在添加之前将子视图控制器与其自身关联   子视图到视图层次结构的根视图。

我读到的方式是,如果您将视图控制器添加为子视图,然后将子视图的根视图添加到视图中,系统应在添加视图控制器时发送相应的消息。

尝试取出对这些方法的手动调用,并在子视图控制器中设置断点,看看它们是否仍然被调用。