Swift5 添加子控制器

在iOS5中,ViewController中新添加了下面几个方法:

addChildViewController:是UIViewController的一个方法,iOS5之后加入的,使用这个方法可以达到addsubView一样的效果,而且好处多多。

addChildViewController的好处:

1. 无疑,对页面中的逻辑更加分明了。相应的View对应相应的ViewController。
2. 当某个子View没有显示时,将不会被Load,减少了内存的使用。
3. 当内存紧张时,没有Load的View将被首先释放,优化了程序的内存释放机制。

API函数

- (void)addChildViewController:(UIViewController *)childController NS_AVAILABLE_IOS(5_0);
- (void)removeFromParentViewController NS_AVAILABLE_IOS(5_0);


 /**
     *            着重介绍一下它
     *  transitionFromViewController:toViewController:duration:options:animations:completion:
     *  fromViewController      当前显示在父视图控制器中的子视图控制器
     *  toViewController        将要显示的姿势图控制器
     *  duration                动画时间(这个属性,old friend 了 O(∩_∩)O)
     *  options                 动画效果(渐变,从下往上等等,具体查看API)
     *  animations              转换过程中得动画
     *  completion              转换完成
     */
- (void)transitionFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^ __nullable)(void))animations completion:(void (^ __nullable)(BOOL finished))completion NS_AVAILABLE_IOS(5_0);

- (void)willMoveToParentViewController:(nullable UIViewController *)parent NS_AVAILABLE_IOS(5_0);
- (void)didMoveToParentViewController:(nullable UIViewController *)parent NS_AVAILABLE_IOS(5_0);

使用方法


(1)添加
/*
*  (1)调整 childViewController View Frame大小 
*       [父控制器.view addsubview:子控制器.view];
*  (2)[父控制器 addChildViewController:子控制器];
*  (3)[子控制器 didMoveToParentViewController:self];
*/
 UIViewController *controller = (UIViewController *)(_controllers[i]);
 controller.view.frame = CGRectMake( 0, 0,self.view.bounds.size.width,self.view.frame.size.height - 64.0f);
[self addChildViewController:controller];
[self.view addSubview:controller.view];

[controller didMoveToParentViewController:self]

;

(2)移除子控制器
[sfViewControllr willMoveToParentViewController:nil];
[sfViewControllr removeFromParentViewController];
[sfViewControllr.view removeFromSuperview];
(3)可能遇到的问题:

如果在子Controller中,把自己从父Controller中移除,在ios6中没问题,在iOS7中,会崩溃

[self willMoveToParentViewController:nil];
[self.view removeFromSuperview];
[self removeFromParentViewController];
//ios7中崩溃
暂时的解决方法,在子Controller中发通知,通知父Controller,移除子Controller

作者:ITCodeShare
链接:https://www.jianshu.com/p/81ad7bc333bf
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Leave a Comment