/*
苹果新的API增加了addChildViewController方法,并且希望我们在使用addSubview时,同时调用[self addChildViewController:child]方法将sub view对应的viewController也加到当前ViewController的管理中。
对于那些当前暂时不需要显示的subview,只通过addChildViewController把subViewController加进去;需要显示时再调用transitionFromViewController方法。将其添加进入底层的ViewController中。
这样做的好处:
1.无疑,对页面中的逻辑更加分明了。相应的View对应相应的ViewController。
2.当某个子View没有显示时,将不会被Load,减少了内存的使用。
3.当内存紧张时,没有Load的View将被首先释放,优化了程序的内存释放机制。
*/
/*** 在iOS5中,ViewController中新添加了下面几个方法: * addChildViewController:* removeFromParentViewController * transitionFromViewController:toViewController:duration:options:animations:completion:* willMoveToParentViewController: * didMoveToParentViewController:*/
* 在iOS5中,ViewController中新添加了下面几个方法:
* addChildViewController:
* removeFromParentViewController
* transitionFromViewController:toViewController:duration:options:animations:completion:
* willMoveToParentViewController:
* didMoveToParentViewController:
*/
// 切换各个标签内容
- (void)replaceController:(UIViewController *)oldController newController:(UIViewController *)newController
{
/*** 着重介绍一下它 * transitionFromViewController:toViewController:duration:options:animations:completion:* fromViewController 当前显示在父视图控制器中的子视图控制器 * toViewController 将要显示的姿势图控制器* duration 动画时间(这个属性,old friend 了 O(∩_∩)O) * options 动画效果(渐变,从下往上等等,具体查看API)* animations 转换过程中得动画 * completion 转换完成*/
* 着重介绍一下它
* transitionFromViewController:toViewController:duration:options:animations:completion:
* fromViewController 当前显示在父视图控制器中的子视图控制器
* toViewController 将要显示的姿势图控制器
* duration 动画时间(这个属性,old friend 了 O(∩_∩)O)
* options 动画效果(渐变,从下往上等等,具体查看API)
* animations 转换过程中得动画
* completion 转换完成
*/
[self addChildViewController:newController];
[self transitionFromViewController:oldController toViewController:newController duration:2.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:nil completion:^(BOOL finished) {
if (finished) {
[newController didMoveToParentViewController:self];
[oldController willMoveToParentViewController:nil];
[oldController removeFromParentViewController];
self.currentVC = newController;
}else{
self.currentVC = oldController;
}
}];
}
/**
128.
* 方法说明:
129.
* 1、addChildViewController:向父VC中添加子VC,添加之后自动调用willMoveToParentViewController:父VC
130.
* 2、removeFromParentViewController:将子VC从父VC中移除,移除之后自动调用
131.
didMoveToParentViewController:nil
132.
* 3、willMoveToParentViewController: 当向父VC添加子VC之后,该方法会自动调用。若要从父VC移除子VC,需要在移除之前调用该方法,传入参数nil。
133.
* 4、didMoveToParentViewController: 当向父VC添加子VC之后,该方法不会被自动调用,需要显示调用告诉编译器已经完成添加(事实上不调用该方法也不会有问题,不太明白); 从父VC移除子VC之后,该方法会自动调用,传入的参数为nil,所以不需要显示调用。
134.
*/
135.
136.
/**
137.
* 注意点:
138.
要想切换子视图控制器a/b,a/b必须均已添加到父视图控制器中,不然会报错
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
MainVC *mainVC = [[MainVC alloc] init];[self presentViewController:mainVC animated:YES completion:nil];
[self presentViewController:mainVC animated:YES completion:nil];
这种方式一般出现在需要使用者完成某件事情,如输入密码、增加资料等操作后,才能(回到跳转前的控制器)继续。例如系统的WIFI连接输入密码提示。默认动画是从下至上。
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
这种方式一般是使用者浏览资料,继而可以前进到下一个页面或回到上一个页面。默认动画是从右至左。
- (void)addChildViewController:(UIViewController *)childController
这个方法出现在iOS5以后,通过它即使不使用NavigationController也能够实现view hierarchy。有以下优点:
1.页面逻辑很清晰,相应的View对应相应的ViewController。
2.当某个子View没有显示时,将不会被Load,减少了内存的使用。
3.当内存紧张时,没有Load的View将被首先释放,优化了程序的内存释放机制。
/**
128.
* 方法说明:
129.
* 1、addChildViewController:向父VC中添加子VC,添加之后自动调用willMoveToParentViewController:父VC
130.
* 2、removeFromParentViewController:将子VC从父VC中移除,移除之后自动调用
131.
didMoveToParentViewController:nil
132.
* 3、willMoveToParentViewController: 当向父VC添加子VC之后,该方法会自动调用。若要从父VC移除子VC,需要在移除之前调用该方法,传入参数nil。
133.
* 4、didMoveToParentViewController: 当向父VC添加子VC之后,该方法不会被自动调用,需要显示调用告诉编译器已经完成添加(事实上不调用该方法也不会有问题,不太明白); 从父VC移除子VC之后,该方法会自动调用,传入的参数为nil,所以不需要显示调用。
134.
*/
135.
136.
/**
137.
* 注意点:
138.
要想切换子视图控制器a/b,a/b必须均已添加到父视图控制器中,不然会报错
三种ViewController跳转的异同