iOS开发addchildcontrolleriOS开发

ViewController容器篇

2016-04-28  本文已影响4041人  芝麻酱的简书

iOS5之后,苹果完善了以viewcontroller来作为容器处理视图控制器切换的相关API,

具体的方法和属性有如下几个:


@property(nonatomic,readonly) NSArray *childViewControllers

- (void)addChildViewController:(UIViewController *)childController

- (void) removeFromParentViewController

- (void)transitionFromViewController...

- (void)willMoveToParentViewController:(UIViewController *)parent

- (void)didMoveToParentViewController:(UIViewController *)parent


willMoveToParentViewController方法:


didMoveToParentViewController方法:

当从一个视图控制容器中添加或者移除viewController后,该方法被调用。


归纳总结:

  1. addChildViewController:向父VC中添加子VC,添加之后自动调用willMoveToParentViewController: superVC

  2. removeFromParentViewController:将子VC从父VC中移除,移除之后自动调用

didMoveToParentViewController: nil

  1. willMoveToParentViewController:当向父VC添加子VC之后,该方法会自动调用。若要从父VC移除子VC,需要在移除之前调用该方法,传入参数nil。

  2. didMoveToParentViewController:
    当向父VC添加子VC之后,该方法不会被自动调用,需要显示调用告诉编译器已经完成添加(事实上不调用该方法也不会有问题,不太明白);
    从父VC移除子VC之后,该方法会自动调用,传入的参数为nil,所以不需要显示调用。

    注意点:

要想切换子视图控制器a/b, a/b必须均已添加到父视图控制器中,不然会报错

  1. transitionFromViewController: toViewController...在调用这个方法之前先调用

[fromViewController willMoveToParentViewController: nil];

在completion后 ,调用[toViewController didMoveToParentViewController:self];

代码实例

                          /************ 添加 ***********/

[self addChildViewController: _currentVC];
 
// [_currentVC willMoveToParentViewController: self];(自动调用  省略)

//[_currentVC didMoveToParentViewController: self]; (可省略)

                         /************ 移除 ***********/

[_currentVC willMoveToParentViewController: nil];

[_currentVC removeFromParentViewController];

//[_currentVC didMoveToParentViewController: nil]; (自动调用 省略)

                         /************ 转换 ***********/
1.
[_currentVC willMoveToParentViewController: nil];

[self transitionFromViewController: _currentVC toViewController: _secondVC];

[_secondVC didMoveToParentViewController: self];

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


上一篇 下一篇

猜你喜欢

热点阅读