IOS—通過ChildViewController實現view的切換


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];


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM