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
方法:
- 當我們向我們的視圖控制器容器中調(diào)用
removeFromParentViewController
方法時捡絮,必須要先調(diào)用該方法竭恬,且parent參數(shù)為nil:
[將要刪除的視圖控制器 willMoveToParentViewController: nil];
[將要刪除的視圖控制器 removeFromParentViewController: 父];
- 當我們調(diào)用
addChildViewController
方法時瞧壮,在添加子視圖控制器之前將自動調(diào)用該方法庆揪。所以遏乔,就不需要我們顯示調(diào)用了义矛。
didMoveToParentViewController
方法:
當從一個視圖控制容器中添加或者移除viewController
后,該方法被調(diào)用盟萨。
- 當我們向我們的視圖控制器容器中添加(或者刪除)子視圖控制器后凉翻,必須調(diào)用該方法,告訴iOS鸯旁,已經(jīng)完成添加(或刪除)子控制器的操作噪矛。
[將要刪除的視圖控制器 addChildViewController: nil];
[將要刪除的視圖控制器 didMoveToParentViewController: 父];
-
removeFromParentViewController
方法會自動調(diào)用了該方法量蕊,所以,刪除子控制器后艇挨,不需要在顯示的調(diào)用該方法了残炮。
歸納總結(jié):
addChildViewController:
向父VC中添加子VC,添加之后自動調(diào)用willMoveToParentViewController: superVC
removeFromParentViewController:
將子VC從父VC中移除缩滨,移除之后自動調(diào)用
didMoveToParentViewController: nil
willMoveToParentViewController:
當向父VC添加子VC之后势就,該方法會自動調(diào)用。若要從父VC移除子VC脉漏,需要在移除之前調(diào)用該方法苞冯,傳入?yún)?shù)nil。-
didMoveToParentViewController:
當向父VC添加子VC之后侧巨,該方法不會被自動調(diào)用舅锄,需要顯示調(diào)用告訴編譯器已經(jīng)完成添加(事實上不調(diào)用該方法也不會有問題,不太明白);
從父VC移除子VC之后司忱,該方法會自動調(diào)用皇忿,傳入的參數(shù)為nil,所以不需要顯示調(diào)用。注意點:
要想切換子視圖控制器a/b, a/b必須均已添加到父視圖控制器中坦仍,不然會報錯
transitionFromViewController: toViewController...
在調(diào)用這個方法之前先調(diào)用
[fromViewController willMoveToParentViewController: nil];
在completion后 ,調(diào)用[toViewController didMoveToParentViewController:self];
代碼實例
?添加?
[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;
}
}];
}