在我们现实的项目中,很多刚入行的工程师可能不会很在意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也将这个移除。其实我今天说的只是一个笼统的概念,具体的说明我会在日后的博客中继续完善,希望我们可以一同进步。