IOS addChildViewController方法使用及注意事項
在iOS 5.0及以後,iOS為UIViewController類添加了新的屬性和方法:
123456 | @property(nonatomic,readonly) NSArray *childViewControllers - ( void )addChildViewController:(UIViewController *)childController - ( void )removeFromParentViewController - ( void )transitionFromViewController:::::: - ( void )willMoveToParentViewController:(UIViewController *)parent - ( void )didMoveToParentViewController:(UIViewController *)parent |
在使用這幾個方法時,呼叫順序很重要,使用程式碼如下:
- [self addChildViewController:newController];
- [self transitionFromViewController:oldController toViewController:newController duration:0.3 options:UIViewAnimationOptionTransitionCrossDissolve animations:nil completion
- if(finished){
- [newController didMoveToParentViewController:self];
- [oldController willMoveToParentViewController:nil];
- [oldController removeFromParentViewController];
- }else{
- }
- }];
這裡最好使用一個viewcontroller表明當前哪一個控制器處於顯示狀態。
這裡看看這幾個方法的具體含義和注意事項:
一、[父檢視控制器 addChildViewController:子檢視控制器];
在此,圖控制器A添加了另一個圖控制器B,那麼A充當父檢視控制器,B充當子檢視控制器。父檢視控制器充當了檢視控制器容器的角色。
1、addChildViewController方法:
1 | - ( void )addChildViewController:(UIViewController *)childController |
向檢視控制器容器中新增子檢視控制器
childController:子檢視控制器
當要新增的子檢視控制器已經包含在檢視控制器容器中,那麼,相當於先從父檢視控制器中刪除,然後重新新增到父檢視控制器中。
2、removeFromParentViewController 方法
1 | - ( void )removeFromParentViewController |
從父檢視控制器中刪除。
3、transitionFromViewController 方法
1 | - ( void )transitionFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:( void (^)( void ))animations completion:( void (^)( BOOL finished))completion |
交換兩個子檢視控制器的位置(由於新增的順序不同,所以子試圖控制器在父檢視控制器中存在層次關係)
fromViewController:當前顯示的子試圖控制器,將被替換為非顯示狀態
toViewController:將要顯示的子檢視控制器
duration:交換動畫持續的時間,單位秒
options:動畫的方式
animations:動畫Block
completion:完成後執行的Block
4、willMoveToParentViewController 方法
1 | - ( void )willMoveToParentViewController:(UIViewController *)parent |
當一個檢視控制器從檢視控制器容器中被新增或者被刪除之前,該方法被呼叫parent:父檢視控制器,如果沒有父檢視控制器,將為nil
注意點:
當我們向我們的檢視控制器容器中呼叫removeFromParentViewController方法時,必須要先呼叫該方法,且parent引數為nil:
[將要刪除的檢視控制器 willMoveToParentViewController:nil];
當我們呼叫addChildViewController方法時,在新增子檢視控制器之前將自動呼叫該方法。所以,就不需要我們顯示呼叫了。
5、didMoveToParentViewController 方法
1 | - ( void )didMoveToParentViewController:(UIViewController *)parent |
當從一個檢視控制容器中新增或者移除viewController後,該方法被呼叫。
parent:父檢視控制器,如果沒有父檢視控制器,將為nil
當我們向我們的檢視控制器容器(就是父檢視控制器,它呼叫addChildViewController方法加入子檢視控制器,它就成為了檢視控制器的容器)中新增(或者刪除)子檢視控制器後,必須呼叫該方法,告訴iOS,已經完成新增(或刪除)子控制器的操作。
removeFromParentViewController 方法會自動呼叫了該方法,所以,刪除子控制器後,不需要在顯示的呼叫該方法了。
其實,這幾個方法中的API說明,看的還懂。
二、關於willMoveToParentViewController方法和didMoveToParentViewController方法的使用
1.這兩個方法用在子試圖控制器交換的時候呼叫!即呼叫transitionFromViewController 方法時,呼叫。
2.當呼叫willMoveToParentViewController方法或didMoveToParentViewController方法時,要注意他們的引數使用:
當某個子檢視控制器將從父檢視控制器中刪除時,parent引數為nil。
即:[將被刪除的子試圖控制器 willMoveToParentViewController:nil];
當某個子試圖控制器將加入到父檢視控制器時,parent引數為父檢視控制器。
即:[將被加入的子檢視控制器 didMoveToParentViewController:父檢視控制器];
3.無需呼叫[子檢視控制器 willMoveToParentViewController:父檢視控制器]方法。因為我們呼叫[父檢視控制器 addChildViewController:子檢視控制器]時,已經預設呼叫了。
只需要在transitionFromViewController方法後,呼叫[子檢視控制器didMoveToParentViewController:父檢視控制器];
4.無需呼叫[子檢視控制器 didMoveToParentViewController:父檢視控制器]方法。因為我們呼叫
[子檢視控制器 removeFromParentViewController]時,已經預設呼叫了。
只需要在transitionFromViewController方法之前呼叫:[子檢視控制器 willMoveToParentViewController:nil]。