IOS—通過ChildViewController實現view的切換
在以前,一個UIViewController的View可能有很多小的子view。這些子view很多時候被蓋在最后,我們在最外層ViewController的viewDidLoad方法中,用addSubview增加了大量的子view。這些子view大多數不會一直處於界面上,只是在某些情況下才會出現,例如登陸失敗的提示view,上傳附件成功的提示view,網絡失敗的提示view等。但是雖然這些view很少出現,但是我們卻常常一直把它們放在內存中。另外,當收到內存警告時,我們只能自己手工把這些view從super view中去掉。
我們現在可以使用下面的方法:
addChildViewController: //添加
removeFromParentViewController //刪除
transitionFromViewController:toViewController:duration:options:animations:completion://轉換
willMoveToParentViewController: //當一個視圖控制器從視圖控制器容器中被添加或者被刪除之前,該方法被調用
didMoveToParentViewController://當從一個視圖控制容器中添加或者移除viewController后,該方法被調用。
這樣,就能夠將一個頁面中的UIViewController控制起來,而不是混亂的共用一個UIViewController
,最重要的是,編程習慣的革命:降低了功能的耦合度!
下面是childViewController的一個簡單使用例子
//在parent view controller 中添加 child view controller
FirstViewController *firstViewController=[[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
[self addChildViewController:firstViewController];
SecondViewController *secondViewController=[[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
[self addChildViewController:secondViewController];
ThirdViewController *thirdViewController=[[ThirdViewController alloc] initWithNibName:@"ThirdViewController" bundle:nil];
[self addChildViewController:thirdViewController];
[self.view addSubview:thirdViewController.view];
// addChildViewController回調用[child willMoveToParentViewController:self] ,但是不會調用didMoveToParentViewController,所以需要顯示調用
[thirdViewController didMoveToParentViewController:self];
currentViewController=thirdViewController;
//切換child view controller
[self transitionFromViewController:currentViewController toViewController:firstViewController duration:4 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{
} completion:^(BOOL finished) {
//......
}];
currentViewController=firstViewController;
//移除child view controller
// removeFromParentViewController在移除child前不會調用[self willMoveToParentViewController:nil] ,所以需要顯示調用
[currentViewController willMoveToParentViewController:nil];
[currentViewController removeFromSuperview];
[currentViewController removeFromParentViewController];