1. 程式人生 > >IOS addChildViewController方法使用及注意事項

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

在使用這幾個方法時,呼叫順序很重要,使用程式碼如下:

  1. [self addChildViewController:newController];  
  2. [self transitionFromViewController:oldController toViewController:newController duration:0.3 options:UIViewAnimationOptionTransitionCrossDissolve animations:nil completion
    :^(BOOL finished) {  
  3.    if(finished){  
  4.        [newController didMoveToParentViewController:self];  
  5.        [oldController willMoveToParentViewController:nil];  
  6.        [oldController removeFromParentViewController];  
  7.     }else{  
  8.  }  
  9. }];  

這裡最好使用一個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

注意點:

  1. 當我們向我們的檢視控制器容器中呼叫removeFromParentViewController方法時,必須要先呼叫該方法,且parent引數為nil:

    [將要刪除的檢視控制器 willMoveToParentViewController:nil];

  2. 當我們呼叫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]。