美文网首页
iOS项目跳转解耦实战(一)

iOS项目跳转解耦实战(一)

作者: IT的救赎 | 来源:发表于2018-04-12 09:55 被阅读12次

今天写的这个主题分为四篇文章,今天是第一篇,我们回讲解的比较简单一些,主要看看大工程中各种各样的跳转模式,各个控制器传参数。在这种情况下,就会出现你中有我,我中有你,十分臃肿,牵一发而动全身。那么怎么才能够解除这种繁重的耦合情况呢,下面看看我是怎么做的吧!

(一)首先我们针对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,如果觉得不错的请给一个星星吧!您的支持就是我前进的动力,谢谢!

相关文章

网友评论

      本文标题:iOS项目跳转解耦实战(一)

      本文链接:https://www.haomeiwen.com/subject/rtfxkftx.html