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

posted @ 2014-12-17 18:32  徐栋  阅读(405)  评论(1编辑  收藏  举报