UIViewController在MVC中扮演着控制层的角色,它的基础功能是管理界面中的每一个view,从而控制数据的传输和界面的展示,关于UIViewController的使用技巧大家可以参看这篇文章。但是,今天我们主要介绍一下在iOS 5中UIViewController的一些新使用方法。
下面详细介绍一下addChildViewController,一个ViewController可以添加多个子ViewController,但是这 些子ViewController只有一个是显示到父视图中的,可以通过transitionFromViewController:toViewController:duration:options:animations:completion:这个方法转换显示的子视图。同时加入相应的动画。
在iOS5中,ViewController中新添加了下面几个方法:
addChildViewController: removeFromParentViewController transitionFromViewController:toViewController:duration:options:animations:completion: willMoveToParentViewController: didMoveToParentViewController:下面详细介绍一下addChildViewController,一个ViewController可以添加多个子ViewController,但是这 些子ViewController只有一个是显示到父视图中的,可以通过transitionFromViewController:toViewController:duration:options:animations:completion:这个方法转换显示的子视图。同时加入相应的动画。下面以一个例子来说明,最后实现的效果:
点击其中的按钮如下:
下面详细介绍一下上述效果的实现:
- 创建项目,changeViewController。
- 添加相应的viewController,MainViewController、FirstViewController、SecondViewController、ThirdViewController。如下图:
- 把MainViewController添加到window中。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. MainViewController *mainViewController=[[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil]; self.window.rootViewController=mainViewController; [self.window makeKeyAndVisible]; return YES; }
- 在MainViewController中添加三个按钮,并且连接onClickbutton方法。
- 在MainViewController中添加三个子controller
#pragma mark – View lifecycle - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. FirstViewController *firstViewController=[[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil]; [self addChildViewController:firstViewController]; SecondViewController *secondViewController=[[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil]; [self addChildViewController:secondViewController]; ThirdViewController *thirdViewController=[[ThirdViewController alloc] initWithNibName:@"ThirdViewController" bundle:nil]; [self addChildViewController:thirdViewController]; [contentView addSubview:thirdViewController.view]; currentViewController=thirdViewController; }
其中要把其中的一个子controller的view添加到根视图中,这样才能显示出相应的视图。 - 点击按钮,切换视图。
-(IBAction)onClickbutton:(id)sender { FirstViewController *firstViewController=[self.childViewControllers objectAtIndex:0]; ThirdViewController *thirdViewController=[self.childViewControllers objectAtIndex:2]; SecondViewController *secondViewController=[self.childViewControllers objectAtIndex:1]; if ((currentViewController==firstViewController&&[sender tag]==1)||(currentViewController==secondViewController&&[sender tag]==2) ||(currentViewController==thirdViewController&&[sender tag]==3) ) { return; } UIViewController *oldViewController=currentViewController; switch ([sender tag]) { case 1: { NSLog(@"留言及回复"); [self transitionFromViewController:currentViewController toViewController:firstViewController duration:4 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{ } completion:^(BOOL finished) { if (finished) { currentViewController=firstViewController; }else{ currentViewController=oldViewController; } }]; } break; case 2: { NSLog(@"生日提醒"); [self transitionFromViewController:currentViewController toViewController:secondViewController duration:1 options:UIViewAnimationOptionTransitionFlipFromTop animations:^{ } completion:^(BOOL finished) { if (finished) { currentViewController=secondViewController; }else{ currentViewController=oldViewController; } }]; } break; case 3: { NSLog(@"好友申请"); [self transitionFromViewController:currentViewController toViewController:thirdViewController duration:1 options:UIViewAnimationOptionTransitionFlipFromBottom animations:^{ } completion:^(BOOL finished) { if (finished) { currentViewController=thirdViewController; }else{ currentViewController=oldViewController; } }]; } break; default: break; } }
其中我把按钮设置成不同的tag了。
这时候点击按钮,就可以切换子视图了。
这样写的好处: 多个UIViewController之间切换可以添加动画 当内存警告的时候,可以把当前不是激活状态的ViewController内存释放。
可以把代码更好分开 项目源代码:http://easymorse-iphone.googlecode.com/svn/trunk/changeViewController/