三种ViewController跳转的异同
2016-02-27 19:39
302 查看
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
这种方式一般出现在需要使用者完成某件事情,如输入密码、增加资料等操作后,才能(回到跳转前的控制器)继续。例如系统的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将被首先释放,优化了程序的内存释放机制。
#import "ViewController.h"
#import "FirstVC.h"
#import "SecondVC.h"
#import "ThirdVC.h"
@interface ViewController ()
{
FirstVC *firstVC;
SecondVC *secondVC;
ThirdVC *thirdVC;
}
@property (weak, nonatomic) IBOutlet UIView *contentView;
@property (strong, nonatomic) UIViewController *currentVC;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
firstVC = [[FirstVC alloc] init];
secondVC = [[SecondVC alloc] init];
thirdVC = [[ThirdVC alloc] init];
[self addChildViewController:firstVC];
[self addChildViewController:secondVC];
[self addChildViewController:thirdVC];
[self.contentView addSubview:thirdVC.view];
self.currentVC = thirdVC;
}
- (IBAction)onClick:(id)sender {
if(self.currentVC==firstVC && [sender tag]==1) {
return;
}
if(self.currentVC==secondVC && [sender tag]==2) {
return;
}
if(self.currentVC==thirdVC && [sender tag]==3) {
return;
}
UIViewController *oldVC = self.currentVC;
switch ([sender tag]) {
case 1: {
[self transitionFromViewController:self.currentVC toViewController:firstVC duration:1 options:UIViewAnimationOptionTransitionCurlUp animations:^{
} completion:^(BOOL finished) {
if(finished) {
self.currentVC = firstVC;
}
else {
self.currentVC = oldVC;
}
}];
}
break;
case 2: {
[self transitionFromViewController:self.currentVC toViewController:secondVC duration:1 options:UIViewAnimationOptionTransitionCurlUp animations:^{
} completion:^(BOOL finished) {
if(finished) {
self.currentVC = secondVC;
}
else {
self.currentVC = oldVC;
}
}];
}
break;
case 3: {
[self transitionFromViewController:self.currentVC toViewController:thirdVC duration:1 options:UIViewAnimationOptionTransitionCurlUp animations:^{
} completion:^(BOOL finished) {
if(finished) {
self.currentVC = thirdVC;
}
else {
self.currentVC = oldVC;
}
}];
}
break;
default:
break;
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
MainVC *mainVC = [[MainVC alloc] init]; [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将被首先释放,优化了程序的内存释放机制。
#import "ViewController.h"
#import "FirstVC.h"
#import "SecondVC.h"
#import "ThirdVC.h"
@interface ViewController ()
{
FirstVC *firstVC;
SecondVC *secondVC;
ThirdVC *thirdVC;
}
@property (weak, nonatomic) IBOutlet UIView *contentView;
@property (strong, nonatomic) UIViewController *currentVC;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
firstVC = [[FirstVC alloc] init];
secondVC = [[SecondVC alloc] init];
thirdVC = [[ThirdVC alloc] init];
[self addChildViewController:firstVC];
[self addChildViewController:secondVC];
[self addChildViewController:thirdVC];
[self.contentView addSubview:thirdVC.view];
self.currentVC = thirdVC;
}
- (IBAction)onClick:(id)sender {
if(self.currentVC==firstVC && [sender tag]==1) {
return;
}
if(self.currentVC==secondVC && [sender tag]==2) {
return;
}
if(self.currentVC==thirdVC && [sender tag]==3) {
return;
}
UIViewController *oldVC = self.currentVC;
switch ([sender tag]) {
case 1: {
[self transitionFromViewController:self.currentVC toViewController:firstVC duration:1 options:UIViewAnimationOptionTransitionCurlUp animations:^{
} completion:^(BOOL finished) {
if(finished) {
self.currentVC = firstVC;
}
else {
self.currentVC = oldVC;
}
}];
}
break;
case 2: {
[self transitionFromViewController:self.currentVC toViewController:secondVC duration:1 options:UIViewAnimationOptionTransitionCurlUp animations:^{
} completion:^(BOOL finished) {
if(finished) {
self.currentVC = secondVC;
}
else {
self.currentVC = oldVC;
}
}];
}
break;
case 3: {
[self transitionFromViewController:self.currentVC toViewController:thirdVC duration:1 options:UIViewAnimationOptionTransitionCurlUp animations:^{
} completion:^(BOOL finished) {
if(finished) {
self.currentVC = thirdVC;
}
else {
self.currentVC = oldVC;
}
}];
}
break;
default:
break;
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
相关文章推荐
- java JDBC 数据库 事务 ACID
- atitit.atiOrmStoreService 框架的原理与设计 part1 概述与新特性
- Java之集合框架
- atitit.atiOrmStoreService 框架的原理与设计 part1 概述与新特性
- 深入理解计算机系统-之-内存寻址(六)--linux中的分页机制
- atitit.atiOrmStoreService 框架的原理与设计 part1 概述与新特性
- Python的zip函数
- 摄像机震动 脚本
- Atitit.code base view 视图的实现原理
- ACdream 1112 Alice and Bob (博弈&&素数筛选优化)
- 两个版本的python在同一系统下的安装
- Atitit.code base view 视图的实现原理
- marshmallow (博弈论)
- poj 2533 Longest Ordered Subsequence
- Atitit.code base view 视图的实现原理
- html5 postMessage解决跨域、跨窗口消息传递
- Emergency relief (枚举+状态压缩)
- leetcode:字符串
- Struts2学习笔记之自定义转换器
- 问卷调查