在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。如下图:
3.把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;
- }
4.在MainViewController中添加三个按钮,并且连接onClickbutton方法。
5.在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添加到根视图中,这样才能显示出相应的视图。
6.点击按钮,切换视图。
- -(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/