在以前,一个UIViewController的View可能有很多小的子view,用addSubview增加了大量的子view。这些子view大多数不会一直处于界面上,只是在某些情况下才会出现,虽然这些view很少出现,但是我们却常常一直把它们放在内存中。另外,当收到内存警告时,我们只能自己手工把这些view从super view中去掉。所以在iOS 5.0及以后,iOS为UIViewController类添加了新的属性和方法:
@property(nonatomic,readonly) NSArray *childViewControllers
- (void)addChildViewController:(UIViewController *)childController
- (void) removeFromParentViewController
- (void)transitionFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
- (void)willMoveToParentViewController:(UIViewController *)parent
- (void)didMoveToParentViewController:(UIViewController *)parent
一 - (void)addChildViewController:(UIViewController *)childController
//向父视图控制器容器中添加子视图控制器
[父视图控制器 addChildViewController:子视图控制器];
当要添加的子视图控制器已经包含在视图控制器容器中,那么,相当于先从父视图控制器中删除,然后重新添加到父视图控制器中
二 - (void)removeFromParentViewController
//从父视图控制器中删除
[子视图控制器 removeFromParentViewController];
三 -(void)transitionFromViewController:(UIViewController )fromViewController toViewController:(UIViewController )toViewController duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
//交换两个子视图控制器的位置(由于添加的顺序不同,所以子试图控制器在父视图控制器中存在层次关系)
[ 父视图 transitionFromViewController: 当前显示的子试图控制器,将被替换为非显示状态
toViewController:将要显示的子视图控制器
options:动画的方式
animations:动画Block
completion:完成后执行的Block]
四 - (void)willMoveToParentViewController:(UIViewController *)parent
//当一个视图控制器从视图控制器容器中被添加或者被删除之前,该方法被调用
[要添加的或者别删除的子视图 willMoveToParentViewController:nil]
注意:
1.removeFromParentViewController 前要调用,且parent参数为nil
2.addChildViewController前,不用调用,以为系统在显示前自动调用
3.只需要在transitionFromViewController方法之前调用。
五- (void)didMoveToParentViewController:(UIViewController *)parent
//当从一个视图控制容器中添加或者移除viewController后,该方法被调用。
[要添加的或者别删除的子视图 didMoveToParentViewController:父视图(或者没有父视图时nil) ]
注意:
1.removeFromParentViewController 后不用我们调用,因为系统删除子控制器后自动调用。
2.addChildViewController后,必须调用该方法。
3.只需要在transitionFromViewController方法后,调用。
例子
例子1 添加子视图控制器
[父视图控制器 addChildViewController:子视图控制器];
子视图控制器.view.frame = 任意frame(一般是父视图的frame);
[父视图控制器.view addSubview:子视图控制器.view];
[子视图控制器 didMoveToParentViewController:父视图控制器];
例子2 移除子视图控制器
[子视图控制器 willMoveToParentViewController:nil];
[子视图控制器.view removeFromSuperview];
[子视图控制器 removeFromParentViewController];
参考
1.addChildViewController
2.willMoveToParentViewController和didMoveToParentViewController
3.Custom Container View Controller(这篇不错,可以仔细看看,可以自定义)
4 .iOS5中UIViewController的新方法(唐巧大神的杰作,有例子)