UIViewController如何作为父容器管理子容器

来源:互联网 发布:手机网络切换开关 编辑:程序博客网 时间:2024/06/02 20:26

父子控制器主要用到下面5个方法

1、- (void)addChildViewController:(UIViewController *)childController;

添加子控制器,建立父子关系;

如果重写此方法,必须在实现中调用父类实现;

调用addChildViewController:会自动调用child的willMoveToParentViewController:方法,不会自动调用didMoveToParentViewController方法;

如果childController已经有一个不同的父控制器,那么它将首先通过调用removeFromParentViewController从当前的父控制器移除。

如果一个父控制器的内容中包含了另一个控制器的view,那么父子控制器的关系是必要的.


2、- (void)removeFromParentViewControllerNS_AVAILABLE_IOS(5_0);

将控制器从父控制器的子控制器数组中移除;

如果重写此方法,必须在实现中调用父类实现;


3、- (void)willMoveToParentViewController:(nullableUIViewController *)parentNS_AVAILABLE_IOS(5_0);

此方法会在视图控制器被添加或移除之前调用;

自定义容器类控制器在调用child的removeFromParentViewController方法前,必须先调用child的willMoveToParentViewController:nil方法;

对于自定义容器类控制器,这个方法与下面的方法都是公开的,可以在子控制器间切换时调用;

如果重写此方法,必须在实现中调用父类实现;

将要从parent移除时,参数传递nil,将要添加到parent时,参数传父控制器;

调用addChildViewController:会自动调用child的willMoveToParentViewController:方法,但不会自动调用didMoveToParentViewController方法,可以在子控制器过渡完成时手动调用didMoveToParentViewController,或者在没有过渡效果时直接手动调用didMoveToParentViewController;

同样的,removeFromParentViewController方法不会自动调用[self willMoveToParentViewController:nil]而需要我们手动进行调用,但会自动调用didMoveToParentViewController方法;


4、- (void)didMoveToParentViewController:(nullableUIViewController *)parentNS_AVAILABLE_IOS(5_0);

此方法会在视图控制器被添加或移除之后调用;

自定义容器类控制器在调用addChildViewController方法之后,必须调用child的didMoveToParentViewController:parent方法,如果有过渡过程,需要在过渡完成之后调用,否则直接调用;

如果重写此方法,必须在实现中调用父类实现;


5、- (void)transitionFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^ __nullable)(void))animations completion:(void (^__nullable)(BOOL finished))completionNS_AVAILABLE_IOS(5_0);

此方法用于在不同的子控制器之间过渡;

过渡完成时,toViewController的view将被添加到fromViewController的view的父视图上,fromViewController的view将被从父视图上移除;

对于iOS本来的容器类控制器例如导航控制器与TabbarController,请不要调用此方法;

也可以直接用UIView的API,但是要确保,在fromViewController的view移除时toViewController的view已经被添加到了视图层级中;

此方法底层中实现的顺序是:添加toViewController的view,执行动画,动画完成时移除fromViewController的view;

如果重写此方法,必须在实现中调用父类实现。