iOS5之后,苹果完善了以viewcontroller来作为容器处理视图控制器切换的相关API,
具体的方法和属性有如下几个:
@property(nonatomic,readonly) NSArray *childViewControllers
- (void)addChildViewController:(UIViewController *)childController
- (void) removeFromParentViewController
- (void)transitionFromViewController...
- (void)willMoveToParentViewController:(UIViewController *)parent
- (void)didMoveToParentViewController:(UIViewController *)parent
willMoveToParentViewController
方法:
-
当我们向我们的视图控制器容器中调用removeFromParentViewController方法时,必须要先调用该方法,且parent参数为nil:
[将要删除的视图控制器 willMoveToParentViewController: nil];
[将要删除的视图控制器 removeFromParentViewController: 父];
-
当我们调用addChildViewController方法时,在添加子视图控制器之前将自动调用该方法。所以,就不需要我们显示调用了。
didMoveToParentViewController
方法:
当从一个视图控制容器中添加或者移除viewController后,该方法被调用。
-
当我们向我们的视图控制器容器中添加(或者删除)子视图控制器后,必须调用该方法,告诉iOS,已经完成添加(或删除)子控制器的操作。
[将要删除的视图控制器 addChildViewController: nil];
[将要删除的视图控制器 didMoveToParentViewController: 父];
-
removeFromParentViewController方法会自动调用了该方法,所以,删除子控制器后,不需要在显示的调用该方法了。
归纳总结:
-
addChildViewController:
向父VC中添加子VC,添加之后自动调用willMoveToParentViewController: superVC
-
removeFromParentViewController:
将子VC从父VC中移除,移除之后自动调用
didMoveToParentViewController: nil
-
willMoveToParentViewController:
当向父VC添加子VC之后,该方法会自动调用。若要从父VC移除子VC,需要在移除之前调用该方法,传入参数nil。 -
didMoveToParentViewController:
当向父VC添加子VC之后,该方法不会被自动调用,需要显示调用告诉编译器已经完成添加(事实上不调用该方法也不会有问题,不太明白);
从父VC移除子VC之后,该方法会自动调用,传入的参数为nil,所以不需要显示调用。注意点:
要想切换子视图控制器a/b, a/b必须均已添加到父视图控制器中,不然会报错
-
transitionFromViewController: toViewController...
在调用这个方法之前先调用
[fromViewController willMoveToParentViewController: nil];
在completion后 ,调用[toViewController didMoveToParentViewController:self];
代码实例
/************ 添加 ***********/
[self addChildViewController: _currentVC];
// [_currentVC willMoveToParentViewController: self];(自动调用 省略)
//[_currentVC didMoveToParentViewController: self]; (可省略)
/************ 移除 ***********/
[_currentVC willMoveToParentViewController: nil];
[_currentVC removeFromParentViewController];
//[_currentVC didMoveToParentViewController: nil]; (自动调用 省略)
/************ 转换 ***********/
1.
[_currentVC willMoveToParentViewController: nil];
[self transitionFromViewController: _currentVC toViewController: _secondVC];
[_secondVC didMoveToParentViewController: self];
2.
//转换子视图控制器
- (void)transitionFromOldViewController:(UIViewController *)oldViewController toNewViewController:(UIViewController *)newViewController{
[self transitionFromViewController:oldViewController toViewController:newViewController duration:0.3 options:UIViewAnimationOptionTransitionCrossDissolve animations:nil completion:^(BOOL finished) {
if (finished) {
[newViewController didMoveToParentViewController:self];
_currentVC = newViewController;
}else{
_currentVC = oldViewController;
}
}];
}
网友评论