4

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

当我尝试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];
                 }];
4

2 回答 2

2

答案一直隐藏在文档中。

的文档UIViewController

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

和同伴

- (void)endAppearanceTransition

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

于 2013-01-28T11:12:40.950 回答
0

您确定系统不会向您的子视图控制器发送 viewWillAppear/viewDidAppear/DidMoveToParentViewController 消息吗?Apple 文档的这一点暗示它确实:

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

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

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

于 2012-05-09T22:03:22.607 回答