在iOS5中鸣剪,ViewController中新添加了下面幾個(gè)方法:
addChildViewController:是UIViewController的一個(gè)方法,iOS5之后加入的挫掏,使用這個(gè)方法可以達(dá)到addsubView一樣的效果撒会,而且好處多多遍尺。
addChildViewController的好處:
1. 無疑质蕉,對(duì)頁面中的邏輯更加分明了。相應(yīng)的View對(duì)應(yīng)相應(yīng)的ViewController传睹。
2. 當(dāng)某個(gè)子View沒有顯示時(shí)耳幢,將不會(huì)被Load,減少了內(nèi)存的使用欧啤。
3. 當(dāng)內(nèi)存緊張時(shí)睛藻,沒有Load的View將被首先釋放,優(yōu)化了程序的內(nèi)存釋放機(jī)制邢隧。
API函數(shù)
- (void)addChildViewController:(UIViewController *)childController NS_AVAILABLE_IOS(5_0);
- (void)removeFromParentViewController NS_AVAILABLE_IOS(5_0);
/**
* 著重介紹一下它
* transitionFromViewController:toViewController:duration:options:animations:completion:
* fromViewController 當(dāng)前顯示在父視圖控制器中的子視圖控制器
* toViewController 將要顯示的姿勢圖控制器
* duration 動(dòng)畫時(shí)間(這個(gè)屬性,old friend 了 O(∩_∩)O)
* options 動(dòng)畫效果(漸變,從下往上等等,具體查看API)
* animations 轉(zhuǎn)換過程中得動(dòng)畫
* completion 轉(zhuǎn)換完成
*/
- (void)transitionFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^ __nullable)(void))animations completion:(void (^ __nullable)(BOOL finished))completion NS_AVAILABLE_IOS(5_0);
- (void)willMoveToParentViewController:(nullable UIViewController *)parent NS_AVAILABLE_IOS(5_0);
- (void)didMoveToParentViewController:(nullable UIViewController *)parent NS_AVAILABLE_IOS(5_0);
使用方法
(1)添加
/*
* (1)調(diào)整 childViewController View Frame大小
* [父控制器.view addsubview:子控制器.view];
* (2)[父控制器 addChildViewController:子控制器];
* (3)[子控制器 didMoveToParentViewController:self];
*/
UIViewController *controller = (UIViewController *)(_controllers[i]);
controller.view.frame = CGRectMake( 0, 0,self.view.bounds.size.width,self.view.frame.size.height - 64.0f);
[self addChildViewController:controller];
[self.view addSubview:controller.view];
[controller didMoveToParentViewController:self];
(2)移除子控制器
[sfViewControllr willMoveToParentViewController:nil];
[sfViewControllr removeFromParentViewController];
[sfViewControllr.view removeFromSuperview];
(3)可能遇到的問題:
如果在子Controller中店印,把自己從父Controller中移除,在ios6中沒問題倒慧,在iOS7中按摘,會(huì)崩潰
[self willMoveToParentViewController:nil];
[self.view removeFromSuperview];
[self removeFromParentViewController];
//ios7中崩潰
暫時(shí)的解決方法,在子Controller中發(fā)通知迫靖,通知父Controller院峡,移除子Controller