在iOS 5.0以前,我們?cè)谝粋€(gè)UIViewController中這樣組織相關(guān)的UIView
在以前,一個(gè)UIViewController的View可能有很多小的子view。這些子view很多時(shí)候被蓋在最后,我們?cè)谧钔鈱覸iewController的viewDidLoad方法中,用addSubview增加了大量的子view愕宋。這些子view大多數(shù)不會(huì)一直處于界面上,只是在某些情況下才會(huì)出現(xiàn)结榄,例如登陸失敗的提示view中贝,上傳附件成功的提示view,網(wǎng)絡(luò)失敗的提示view等臼朗。但是雖然這些view很少出現(xiàn)邻寿,但是我們卻常常一直把它們放在內(nèi)存中。另外视哑,當(dāng)收到內(nèi)存警告時(shí)绣否,我們只能自己手工把這些view從super view中去掉。
在iOS 5.0及以后挡毅,iOS為UIViewController類(lèi)添加了新的屬性和方法:
@property(nonatomic,readonly) NSArray *childViewControllers
- (void)addChildViewController:(UIViewController *)childController
- (void) removeFromParentViewController
- (void)transitionFromViewController::::::
- (void)willMoveToParentViewController:(UIViewController *)parent
- (void)didMoveToParentViewController:(UIViewController *)parent
這樣蒜撮,就能夠?qū)⒁粋€(gè)頁(yè)面中的UIViewController控制起來(lái),而不是混亂的共用一個(gè)UIViewController
跪呈,最重要的是段磨,編程習(xí)慣的革命:降低了功能的耦合度!
寫(xiě)這篇博客耗绿,僅僅是講以上5個(gè)方法苹支!僅此而已。因?yàn)楫?dāng)我在百度或者谷歌中缭乘,輸入以上5個(gè)方法的名字后沐序,查出來(lái)的,并沒(méi)有告訴這5個(gè)方法起到如何的作用堕绩?如何使用?
所以邑时,我僅僅是想從API角度來(lái)談一談奴紧,這5個(gè)方法。
廢話不多說(shuō)了晶丘!
先搞清楚一個(gè)今天提到的概念:
[父視圖控制器addChildViewController:子視圖控制器];
在此黍氮,圖控制器A添加了另一個(gè)圖控制器B唐含,那么A充當(dāng)父視圖控制器,B充當(dāng)子視圖控制器沫浆。父視圖控制器充當(dāng)了視圖控制器容器的角色捷枯。
addChildViewController方法:
- (void)addChildViewController:(UIViewController *)childController
向視圖控制器容器中添加子視圖控制器
childController:子視圖控制器
當(dāng)要添加的子視圖控制器已經(jīng)包含在視圖控制器容器中,那么专执,相當(dāng)于先從父視圖控制器中刪除淮捆,然后重新添加到父視圖控制器中。
removeFromParentViewController 方法
- (void)removeFromParentViewController
從父視圖控制器中刪除本股。
transitionFromViewController 方法
- (void)transitionFromViewController:(UIViewController *)fromViewControllertoViewController:(UIViewController *)toViewControllerduration:(NSTimeInterval)durationoptions:(UIViewAnimationOptions)optionsanimations:(void (^)(void))animationscompletion:(void (^)(BOOL finished))completion
交換兩個(gè)子視圖控制器的位置(由于添加的順序不同攀痊,所以子試圖控制器在父視圖控制器中存在層次關(guān)系)
fromViewController:當(dāng)前顯示的子試圖控制器,將被替換為非顯示狀態(tài)
toViewController:將要顯示的子視圖控制器
duration:交換動(dòng)畫(huà)持續(xù)的時(shí)間拄显,單位秒
options:動(dòng)畫(huà)的方式
animations:動(dòng)畫(huà)Block
completion:完成后執(zhí)行的Block
willMoveToParentViewController 方法
- (void)willMoveToParentViewController:(UIViewController *)parent
當(dāng)一個(gè)視圖控制器從視圖控制器容器中被添加或者被刪除之前苟径,該方法被調(diào)用
parent:父視圖控制器,如果沒(méi)有父視圖控制器躬审,將為nil
注意點(diǎn):
1.當(dāng)我們向我們的視圖控制器容器中調(diào)用removeFromParentViewController方法時(shí)棘街,必須要先調(diào)用該方法,且parent參數(shù)為nil:
[將要?jiǎng)h除的視圖控制器willMoveToParentViewController:nil];
2.當(dāng)我們調(diào)用addChildViewController方法時(shí)承边,在添加子視圖控制器之前將自動(dòng)調(diào)用該方法遭殉。所以,就不需要我們顯示調(diào)用了炒刁。
didMoveToParentViewController 方法
- (void)didMoveToParentViewController:(UIViewController *)parent
當(dāng)從一個(gè)視圖控制容器中添加或者移除viewController后恩沽,該方法被調(diào)用。
parent:父視圖控制器翔始,如果沒(méi)有父視圖控制器罗心,將為nil
當(dāng)我們向我們的視圖控制器容器(就是父視圖控制器,它調(diào)用addChildViewController方法加入子視圖控制器城瞎,它就成為了視圖控制器的容器)中添加(或者刪除)子視圖控制器后渤闷,必須調(diào)用該方法,告訴iOS脖镀,已經(jīng)完成添加(或刪除)子控制器的操作飒箭。
removeFromParentViewController方法會(huì)自動(dòng)調(diào)用了該方法,所以蜒灰,刪除子控制器后弦蹂,不需要在顯示的調(diào)用該方法了。
其實(shí)强窖,這幾個(gè)方法中的API說(shuō)明凸椿,看的還懂。
最后翅溺,
關(guān)于willMoveToParentViewController方法和didMoveToParentViewController方法的使用
1.這兩個(gè)方法用在子試圖控制器交換的時(shí)候調(diào)用脑漫!即調(diào)用transitionFromViewController 方法時(shí)髓抑,調(diào)用。
2.當(dāng)調(diào)用willMoveToParentViewController方法或didMoveToParentViewController方法時(shí)优幸,要注意他們的參數(shù)使用:
當(dāng)某個(gè)子視圖控制器將從父視圖控制器中刪除時(shí)吨拍,parent參數(shù)為nil。
即:[將被刪除的子試圖控制器willMoveToParentViewController:nil];
當(dāng)某個(gè)子試圖控制器將加入到父視圖控制器時(shí)网杆,parent參數(shù)為父視圖控制器羹饰。
即:[將被加入的子視圖控制器didMoveToParentViewController:父視圖控制器];
3.無(wú)需調(diào)用[子視圖控制器willMoveToParentViewController:父視圖控制器]方法。因?yàn)槲覀冋{(diào)用[父視圖控制器addChildViewController:子視圖控制器]時(shí)跛璧,已經(jīng)默認(rèn)調(diào)用了严里。
只需要在transitionFromViewController方法后,調(diào)用[子視圖控制器didMoveToParentViewController:父視圖控制器];
4.無(wú)需調(diào)用[子視圖控制器didMoveToParentViewController:父視圖控制器]方法追城。因?yàn)槲覀冋{(diào)用
[子視圖控制器removeFromParentViewController]時(shí)刹碾,已經(jīng)默認(rèn)調(diào)用了。
只需要在transitionFromViewController方法之前調(diào)用:[子視圖控制器willMoveToParentViewController:nil]座柱。
希望對(duì)你有所幫助迷帜!