iOS之ViewController容器篇

iOS5之后,蘋果完善了以viewController來作為容器處理視圖控制器切換的相關(guān)API,

具體的方法和屬性有如下幾個:


@property(nonatomic,readonly) NSArray *childViewControllers

- (void)addChildViewController:(UIViewController *)childController

- (void) removeFromParentViewController

- (void)transitionFromViewController...

- (void)willMoveToParentViewController:(UIViewController *)parent

- (void)didMoveToParentViewController:(UIViewController *)parent



willMoveToParentViewController方法:

  • 當(dāng)我們向我們的視圖控制器容器中調(diào)用removeFromParentViewController方法時(shí),必須要先調(diào)用該方法,且parent參數(shù)為nil:
   [將要刪除的視圖控制器 willMoveToParentViewController: nil];

   [將要刪除的視圖控制器 removeFromParentViewController: 父];
  • 當(dāng)我們調(diào)用addChildViewController方法時(shí),在添加子視圖控制器之前將自動調(diào)用該方法。所以,就不需要我們顯示調(diào)用了。


didMoveToParentViewController方法:

當(dāng)從一個視圖控制容器中添加或者移除viewController后,該方法被調(diào)用。

  • 當(dāng)我們向我們的視圖控制器容器中添加(或者刪除)子視圖控制器后,必須調(diào)用該方法,告訴iOS,已經(jīng)完成添加(或刪除)子控制器的操作。
   [將要刪除的視圖控制器 addChildViewController: nil];

   [將要刪除的視圖控制器 didMoveToParentViewController: 父];
  • removeFromParentViewController方法會自動調(diào)用了該方法,所以,刪除子控制器后,不需要在顯示的調(diào)用該方法了。


歸納總結(jié):

  1. addChildViewController:向父VC中添加子VC,添加之后自動調(diào)用willMoveToParentViewController: superVC

  2. removeFromParentViewController:將子VC從父VC中移除,移除之后自動調(diào)用

didMoveToParentViewController: nil

  1. willMoveToParentViewController:當(dāng)向父VC添加子VC之后,該方法會自動調(diào)用。若要從父VC移除子VC,需要在移除之前調(diào)用該方法,傳入?yún)?shù)nil。

  2. didMoveToParentViewController:
    當(dāng)向父VC添加子VC之后,該方法不會被自動調(diào)用,需要顯示調(diào)用告訴編譯器已經(jīng)完成添加(事實(shí)上不調(diào)用該方法也不會有問題,不太明白);
    從父VC移除子VC之后,該方法會自動調(diào)用,傳入的參數(shù)為nil,所以不需要顯示調(diào)用。

    注意點(diǎn):

    要想切換子視圖控制器a/b, a/b必須均已添加到父視圖控制器中,不然會報(bào)錯

  3. transitionFromViewController: toViewController...在調(diào)用這個方法之前先調(diào)用

[fromViewController willMoveToParentViewController: nil];

在completion后 ,調(diào)用[toViewController didMoveToParentViewController:self];



代碼實(shí)例

                              ?添加?

[self addChildViewController: _currentVC];
// [_currentVC willMoveToParentViewController: self];(自動調(diào)用  省略)
//[_currentVC didMoveToParentViewController: self]; (可省略)

                               ?移除?  

[_currentVC willMoveToParentViewController: nil];
[_currentVC removeFromParentViewController];
//[_currentVC didMoveToParentViewController: nil]; (自動調(diào)用 省略)

                                ?轉(zhuǎn)換?
轉(zhuǎn)換方式1:
[_currentVC willMoveToParentViewController: nil];
[self transitionFromViewController: _currentVC toViewController: _secondVC];
[_secondVC didMoveToParentViewController: self];

轉(zhuǎn)換方式2:
- (void)transitionFromOldViewController:(UIViewController *)oldViewController toNewViewController:(UIViewController *)newViewController{
    [self transitionFromViewController:oldViewController toViewController:newViewController duration:0.3 options:UIViewAnimationOptionTransitionCrossDissolve animations:nil completion:^(BOOL finished) {
        if (finished) {
            [newViewController didMoveToParentViewController:self];
            _currentVC = newViewController;
        }else{
            _currentVC = oldViewController;
        }
    }];
}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容