iOS 5.0 以前 ,我们在一个视图控制器中会用addSubView方法来添加很多子View,并进行对这些子View的控制。
但是,这样做,有一个问题:
一个UIViewController的View可能有很多小的子view。这些子view很多时候被盖在最后,我们在最外层ViewController的viewDidLoad方法中,用addSubview增加了大量的子view。这些子view大多数不会一直处于界面上,只是在某些情况下才会出现,例如登陆失败的提示view,上传附件成功的提示view,网络失败的提示view等。但是虽然这些view很少出现,但是我们却常常一直把它们放在内存中。另外,当收到内存警告时,我们只能自己手工把这些view从super
view中去掉。
2.替代方法
聪明的你,也许已经体会到了,该transitionFromViewController方法闪亮登场:
苹果新的API增加了addChildViewController方法,并且希望我们在使用addSubview时,同时调用[self addChildViewController:child]方法将sub view对应的viewController也加到当前ViewController的管理中。
对于那些当前暂时不需要显示的subview,只通过addChildViewController把subViewController加进去;需要显示时再调用transitionFromViewController方法。将其添加进入底层的ViewController中。
这样做的好处:
1.无疑,对页面中的逻辑更加分明了。相应的View对应相应的ViewController。
2.当某个子View没有显示时,将不会被Load,减少了内存的使用。
3.当内存紧张时,没有Load的View将被首先释放,优化了程序的内存释放机制。
3.transitionFromViewController:toViewController:duration:options:animations:completion 方法
- (void)transitionFromViewController:(UIViewController *)fromViewControllertoViewController:(UIViewController *)toViewController duration:(NSTimeInterval)durationoptions:(UIViewAnimationOptions)options animations:(void
(^)(void))animationscompletion:(void (^)(BOOL finished))completion
在两个子视图控制器中转换。支持的iOS 5.0以及以后的版本。
fromViewController:当前显示在父视图控制器中的子视图控制器
toViewController:将要显示的子视图控制器
duration:完成过渡的时间;单位:秒。
options:指定的过渡效果。
animations:转换过程中,的动画。是个Block块操作。
completion:过渡完成后,执行的Block块操作。
该方法,执行完以后,fromViewController指代的视图控制器的View将从界面消失;
toViewController所指代的视图控制器的View将被载入到页面中。
4.使用方法
1.在父ViewController中,使用方法,将各个子添加进来。
- (void)viewDidLoad{
[super viewDidLoad];
// 对于不显示的子ViewController,要用addChildViewController方法,将其添加到父ViewController中
firstViewController=[[FirstViewController alloc] initWithNibName:@"FirstViewController"bundle:nil];
[self addChildViewController:firstViewController];
secondViewController=[[SecondViewController alloc] initWithNibName:@"SecondViewController"bundle:nil];
[self addChildViewController:secondViewController];
thirdViewController=[[ThirdViewController alloc] initWithNibName:@"ThirdViewController"bundle:nil];
[self addChildViewController:thirdViewController];
// 需要显示的子ViewController,要将其View添加到父View中
[self.view addSubview:thirdViewController.view];
currentViewController=thirdViewController;
}
2.根据按钮事件,来transitionFromViewController方法来切换相应的子View
-(IBAction)onClickbutton:(id)sender
{
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:1
options:UIViewAnimationOptionTransitionCurlUp
animations:^{
//
NOPS;
}
completion:^(BOOL finished)
{
if (finished)
{
currentViewController=firstViewController;
}else{
currentViewController=oldViewController;
}
}];
}
break;
case 2:{
NSLog(@"生日提醒");
[self transitionFromViewController:currentViewController
toViewController:secondViewController
duration:1
options:UIViewAnimationOptionTransitionCurlDown
animations:^{
}
completion:^(BOOL finished)
{
if (finished)
{
currentViewController=secondViewController;
}else{
currentViewController=oldViewController;
}
}];
}
break;
case 3:
{
NSLog(@"好友申请");
[self transitionFromViewController:currentViewController
toViewController:thirdViewController
duration:1
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^{
}
completion:^(BOOL finished)
{
if (finished)
{
currentViewController=thirdViewController;
}else{
currentViewController=oldViewController;
}
}];
}
break;
default:
break;
}
}
注明:该源代码是从上下载的,谢谢该代码作者的分享!
希望对你有所帮助!