我有以下代码在容器视图中用一个容器视图控制器替换另一个视图。这是从Apple文档中复制的。
编辑:Apple文档Creating Custom Container View Controllers
- (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会将ViewController.view添加到视图层次结构中。如果我取消注释addSubview行以便我手动添加它,则会出现视图,但是视图上的外观方法会被多次调用。在这种情况下,完成块中的完成值为TRUE。
WelcomeViewController viewWillAppear
WelcomeViewController viewWillAppear
WelcomeViewController viewDidAppear
finished: 1
WelcomeViewController viewDidAppear
我很确定我不应该基于其他几个示例手动将视图添加到视图层次结构中。为什么不起作用?
答案 0 :(得分:0)
原来上面的代码是正确的,问题出在其他地方。问题是第一次通过此转换时,self.childViewController.view不在视图层次结构中。 self.childViewController本身位于视图控制器层次结构中,但视图不是。