zoukankan      html  css  js  c++  java
  • 关于创建Custom Container View Controller

       在我们现实的项目中,很多刚入行的工程师可能不会很在意controller的设计概念,因为接到的项目有限,而且多数公司的项目架构已经由主程开发好了,所以能接触到的只不过是一些功能模块,这对一个程序员的发展是很不利的,功能熟知的再多,也不过是龙套角色,因为再强大的功能在度娘,谷歌,github等面前都是浮云。那么我今天要写的这篇博客就是简单的介绍一下关于自定义ContainerViewController。

      我们首先看一下苹果对于ContainerViewController的官方解释 A container view controller contains content owned by other view controllers.也就是说一个ContainerViewController的主要功能是负责管理其他子controller的,比如UINavigationController,UITabBarController等。这些controller都是负责管理我们的controller的,既然我们对ContainerViewController有了一点概念,那我们先看一下效果图。

      正常而言如果我们设计三个界面,我们会选择用A->B->C这个模式,这样如果我们想从A->C的时候这样实现起来就相对复杂一点,管理三个controller就如此复杂,更何况一个项目动辄几十个controller管理,那我们有什么好的设计方式呢?答案其实就在UINavigationController这个苹果自己给的ContainerViewController里。

      首先我们创建一个CoustomContainerViewController用于管理这三个子controller,这样我们不仅降低了各个controller之间的耦合性,而且还可以通过这个CoustomContainerViewController对所有的controller进行管理。废话不多说,先上代码:

        BaseViewController *firstVC                  = \

        [[firstClass alloc]initWithNibName:name.firstViewController bundle:nil];

        firstVC.delegate = self;

        [self addChildViewController:firstVC];

        firstVC.view.frame = self.view.frame;

        [self.view addSubview:firstVC.view];

        [firstVC didMoveToParentViewController:self];

        _currentVC = firstVC;

      这里我用到了一个面向对象的多态性,创建一个BaseViewController的抽象类,随后创建三个子类实现父类方法。我们将初始化好的firstVC添加到这个CoustomContainerViewController中,然后进行管理。这个时候我们遇到一个问题,如果我想让firstVC上button的点击方法在当前的controller里执行需要怎么做?当然这里面我用的是代理的设计模式。

    @protocol SelectViewControllerDelegate <NSObject>

    -(void)selectOtherViewController:(id)obj viewName:(NSString *)name;

    @end

      创建一个.h文件,在里面写上这个代理方法。在BaseViewController这个抽象类里声明实例变量以及属性,这样,当他的子类继承的时候,便可以直接使用这个,具体的实现方式这里就不多说了。

      然后我们在CoustomContainerViewController里实现这个代理方法:

    -(void)selectOtherViewController:(id)obj viewName:(NSString *)name

    {

    //    ViewControllerName *name    = [ViewControllerName copySelfAllProperty];

        Class secondClass            = NSClassFromString(name);

       

        BaseViewController *secondVC                  = \

        [[secondClass alloc]initWithNibName:name bundle:nil];

        secondVC.delegate = self;

        [self addChildViewController:secondVC];

        secondVC.view.frame = self.view.frame;

        [self.view addSubview:secondVC.view]; 

        [secondVC willMoveToParentViewController:self]; 

        

        [self transitionFromViewController:_currentVC toViewController:secondVC duration:1 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{

            

        } completion:^(BOOL finished) {

            NSLog(@"controllers = %@",self.childViewControllers);

            [_currentVC.view removeFromSuperview];

            [_currentVC removeFromParentViewController];

            _currentVC = secondVC;

        }];

    }

      当我们点击的时候便执行这个方法,让当前的主CoustomContainerViewController也将这个移除。其实我今天说的只是一个笼统的概念,具体的说明我会在日后的博客中继续完善,希望我们可以一同进步。

  • 相关阅读:
    leetcode 33. Search in Rotated Sorted Array
    leetcode 32. Longest Valid Parentheses
    leetcode 28. Implement strStr()
    leetcode 27. Remove Element
    leetcode 26. Remove Duplicates from Sorted Array
    leetcode 24. Swap Nodes in Pairs
    leetcode 22. Generate Parentheses
    树莓派的频率管理和热控制
    sql执行insert插入一条记录同时获取刚插入的id
    全程直播个人博客重构过程,采用springboot+dubbo+jpa技术栈。
  • 原文地址:https://www.cnblogs.com/xuruofan/p/4170082.html
Copyright © 2011-2022 走看看