代码改变世界

转:iOS5中UIViewController新方法的使用

2012-01-14 22:06  张智清  阅读(1730)  评论(0编辑  收藏  举报

在iOS5中,ViewController中新添加了下面几个方法:

  • addChildViewController:
  • removeFromParentViewController:
  • transitionFromViewController:toViewController:duration:options:animations:completion:
  • willMoveToParentViewController:
  • didMoveToParentViewController:

下面详细介绍一下addChildViewController,一个ViewController可以添加多个子ViewController,但是这些子ViewController要想显示出来,需要把子controller的视图添加到父视图的相应位置,可以通过transitionFromViewController:toViewController:duration:options:animations:completion:这个方法转换显示的子视图。同时加入相应的动画。下面以一个例子来说明,最后的实现效果:

 点击其中的按钮如下:

下面详细介绍一下上述效果的实现:
1. 创建项目,changeViewController。

2. 添加相应的viewController,MainViewController、FirstViewController、SecondViewController、ThirdViewController。如下图:

 3. 把MainViewController添加到window中。

-(BOOL)application:(UIApplication *)application didFinishLauchingWithOptions:(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

- (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/
本文转载自: http://wangjun.easymorse.com/?p=1630