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也将这个移除。其实我今天说的只是一个笼统的概念,具体的说明我会在日后的博客中继续完善,希望我们可以一同进步。

  • 相关阅读:
    oracle 复制表结构 复制表数据 sql 语句
    Linux rsync实现断点续传
    qt实现一个简单的计算器
    python脚本0b文件处理
    同步和互斥
    python中的randint,引入模块
    python中常见的三种句型if,while,for
    python中的变量,运算符
    python安装与使用
    常见dos命令总结
  • 原文地址:https://www.cnblogs.com/xuruofan/p/4170082.html
Copyright © 2011-2022 走看看