1

我有以下代码用相应的容器视图控制器在容器视图中用另一个视图替换一个视图。这是从 Apple 文档中复制的。

编辑:Apple 文档创建自定义容器视图控制器

- (void)transitionToViewController:(UIViewController*)toViewController {
    toViewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

    [self.childViewController willMoveToParentViewController:nil];

    [self addChildViewController:toViewController];
    // [self.view addSubview:toViewController.view];


    toViewController.view.frame = CGRectOffset(self.view.bounds, self.view.frame.size.width, 0);

    [self transitionFromViewController:self.childViewController
                      toViewController:toViewController
                              duration:0.5
                               options:0
                            animations:^{
                                toViewController.view.frame = self.view.bounds;
                            }
                            completion: ^(BOOL finished) {
                                NSLog(@"finished: %d", finished);
                                [self.childViewController removeFromParentViewController];
                                [toViewController didMoveToParentViewController:self];

                                self.childViewController = toViewController;
                            }];

}

执行此操作时, toViewController.view 实际上并没有出现。但是,在 toViewController.view 中调用了 viewWillAppear 和 viewDidAppear。在完成块中,finished 的值为 FALSE。所以有些东西不能正常工作。

我知道 transitionFromViewController 会将 toViewController.view 添加到视图层次结构中。如果我取消注释 addSubview 行以便手动添加它,则视图确实会出现,但是视图上的外观方法会被多次调用。在这种情况下,完成块中的完成值是 TRUE。

WelcomeViewController viewWillAppear
WelcomeViewController viewWillAppear
WelcomeViewController viewDidAppear
finished: 1
WelcomeViewController viewDidAppear

我很确定我不应该根据其他几个示例手动将视图添加到视图层次结构中。为什么它不起作用?

4

1 回答 1

0

原来上面的代码是正确的,问题出在其他地方。问题是第一次通过这种转换,self.childViewController.view 不在视图层次结构中。self.childViewController 本身在视图控制器层次结构中,但视图不在。

于 2013-05-03T16:03:54.470 回答