如何在视图控制器容器中呈现第一个视图控制器

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];
                 }];

你有没有找到解决这个问题的方法?我也遇到了同样的问题… - Mark Armstrong
不好意思,我只是自己为第一个视图控制器做了viewWillAppear和viewDidAppear。 - jackslash
2个回答

2

答案一直都隐藏在文档中。

UIViewController的文档是:

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

和配套的

- (void)endAppearanceTransition

它们的文档说从自己的代码中不要调用viewWillAppear等方法,你可以使用这些方法正确触发链。


0

你确定系统不会向你的子视图控制器发送viewWillAppear/viewDidAppear/DidMoveToParentViewController消息吗?苹果文档的这部分暗示了它会:

为了让iOS能够正确地将事件路由到子视图控制器和那些控制器管理的视图,你的容器视图控制器必须在将子视图的根视图添加到视图层级之前将子视图控制器与自己相关联。

按照我的理解,如果你将一个视图控制器作为子视图添加,然后将子视图的根视图添加到你的视图中,系统应该在添加视图控制器时发送适当的消息。

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


如果一切按照预期运行,这些手动调用就不会存在。尽管文档中说的不同,但似乎只有在使用transitionFromViewController:toViewController:duration:options:animation:completion:将视图插入层次结构时,外观方法才会被调用。 - jackslash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接