iOS项目跳转解耦实战(一)
今天写的这个主题分为四篇文章,今天是第一篇,我们回讲解的比较简单一些,主要看看大工程中各种各样的跳转模式,各个控制器传参数。在这种情况下,就会出现你中有我,我中有你,十分臃肿,牵一发而动全身。那么怎么才能够解除这种繁重的耦合情况呢,下面看看我是怎么做的吧!
(一)首先我们针对Present跳转来讲,我们创建一个基类控制器BSY_DecouplingControlBaseVC,在.h文件中协商写上这三个方法,分别是:
/**
在目标控制器初始化的时候传入参数(可以为空)
@param parameters 参数
@return 返回初始化的自己
*/
-(id)initWithParameters:(id)parameters;
/**
跳转事件
@param classString 需要跳转的控制器
@param object 跳转的时候需要传入的参数
@param completeBlock 跳转完成的回调
*/
-(void)bsy_JumpVC:(NSString *)classString object:(id)object animate:(BOOL)animate completeBlock:(void(^)(id completeObj))completeBlock;
/**
dissMiss事件
@param classString 需要跳转的控制器
@param childClass 需要disMiss的控制器字典
@param object 跳转的时候需要传入的参数
@param completeBlock 跳转完成的回调
@param animate 是否需要动画
*/
-(void)bsy_DissMissVC:(NSString *)classString childClass:(NSMutableDictionary *)childClass object:(id)object animate:(BOOL)animate completeBlock:(void(^)(id completeObj))completeBlock;
其次,我们在.m文件中去实现方法,如下:
/**
重写init方法
@param parameters 参数
@return 返回VC
*/
-(id)initWithParameters:(id)parameters
{
self = [super init];
if (self) {
}
return self;
}
/**
跳转事件
@param classString 需要跳转的控制器
@param object 跳转的时候需要传入的参数
@param completeBlock 跳转完成的回调
*/
-(void)bsy_JumpVC:(NSString *)classString object:(id)object animate:(BOOL)animate completeBlock:(void(^)(id completeObj))completeBlock
{
if ([classString isKindOfClass:[NSString class]]) {
Class class = NSClassFromString(classString);
[self presentViewController:(UIViewController *)[[class alloc]initWithParameters:object] animated:animate completion:nil];
if (completeBlock) {
completeBlock(NSStringFromClass([class class]));
}
}else{
if (completeBlock) {
completeBlock(NSStringFromClass([NSError class]));
}
}
}
/**
dissMiss事件
@param classString 需要跳转的控制器
@param object 跳转的时候需要传入的参数
@param completeBlock 跳转完成的回调
*/
-(void)bsy_DissMissVC:(NSString *)classString childClass:(NSMutableDictionary *)childClass object:(id)object animate:(BOOL)animate completeBlock:(void(^)(id completeObj))completeBlock
{
if ([classString isKindOfClass:[NSString class]]) {
Class class = NSClassFromString(classString);
UIViewController *vc = nil;
vc = [childClass objectForKey:classString];
if ([vc isKindOfClass:[class class]]) {
[vc dismissViewControllerAnimated:animate completion:nil];
if (completeBlock) {
completeBlock(NSStringFromClass([class class]));
}
}else{
if (completeBlock) {
completeBlock(NSStringFromClass([NSError class]));
}
}
}else{
if (completeBlock) {
completeBlock(NSStringFromClass([NSError class]));
}
}
}
最后,我们以BSY_DecouplingControlBaseVC为父类,创建需要的控制器,就可以实现了传参数与跳转,这样就省去了每个控制器的.h文件中各种各种的属性定义。如下:
[self bsy_JumpVC:NSStringFromClass([PresentController class]) object:nil animate:true completeBlock:^(id completeObj) {
}];
至于pushViewController跳转也就照葫芦画瓢,我不多讲了。这种方式有很多好处,我们传什么参数,直接在各自的.m文件中获取即刻,这样就省去了每个控制器的.h文件中各种各种的属性定义,这也是解除耦合的一种方法,小工程还好,我现在在的公司做的事系统类型的iPad应用,工程文件都是800多个文件,如果每个控制器都是中各种各种的属性定义,你中有我,我中有你那就没有办法开发了。当然这只是其中最简单的一部分,后面三部分我会讲解的更多一些。
具体Demo代码地址:https://gitee.com/baishiyun/ios_project_jump_decoupling_real_war__1/tree/master,如果觉得不错的请给一个星星吧!您的支持就是我前进的动力,谢谢!