ZZRouter

ZZRouter (OC)

一款只专注于路由的简单框架

自己造的轮子,非本人许可,禁止转发!

github

https://github.com/LzzHero/ZZRouter

使用

ZZRouter分为路由的注册和使用两个阶段

注册一个路由

1、引入 <ZZRouter/ZZRouter.h>

2、在VC的 load 方法中 写入代码:

+ (void)load {
    RouterPath(@"name")
}

其中 name 为该模块(VC)的唯一标识

使用路由进行跳转

1、引入 <ZZRouter/ZZRouter.h>

2、调用以下代码即可完成跳转

ZZRouter.load(@"name");

默认跳转方式为push

3、当然,如果在跳转中传递参数,只需如下操作即可

ZZRouter.load(@"name",@{@"id":@"123"});

至此,恭喜你已经完成了对ZZRouter的接入

进一步操作

ZZRouter还提供了许多方法,可以自定义跳转事件和自定义转发的拦截,辅助完成各种业务场景

转发单元

ZZRouter实现页面的跳转,是依赖于转发单元。
每一个模块“name”,都对应一个转发单元“unit”(ZZTransUnit)
使用者可以自定义转发单元来实现跳转操作,如果没有自定义的实现,ZZRouter将会自动帮助你实现一个,并且默认为push操作

自定义转发单元

你可以通过自定义转发单元来达到present,或者自定义VC切换动画的目的。

1、自定义的转发单元,需要继承自 ZZTransUnit

@interface myUnit : ZZTransUnit
@end

2、在 myUnit 的load方法中,注册转发单元
注意,这里的name必须和模块的name保持一致,这样才能准确地匹配模块

+ (void)load {
    RouterUnit(@"name")
}

3、实现消息转发的方法

其中参数:
toObject -- 即将跳转的VC,或者可以理解为注册了 RouterPath(@"name") 的对象
param -- 在外部调用时外边传递的参数
complete -- 一个block,在自定义的事件处理完以后,需要调用该block(BOOL),他需要一个bool值,告诉是否成功完成自定义的跳转。此处在稍后的路径跳转会说明调用的原因。

你也可以直接调用super的方法,super的方法就是默认push到toObject

- (void)dealMessageWithtargetObject:(id)toObject params:(id)param dealFinished:(void (^)(BOOL))complete {
    //[super dealMessageWithtargetObject:toObject params:param dealFinished:complete];
}

至此,你已经自定义了转发单元,并可以在这里进行自定义的跳转操作。

拦截器

拦截器,顾名思义,针对一个或一种活一类路由进行过滤,只通过想要通过的路由。
当消息发送给转发单元前,会先被拦截器拦截

自定义拦截器

ZZRouter本身不自带任何拦截器,如果需要拦截,要自定义拦截器使用。

1、拦截器,要继承自 ZZTransFilter

@interface MyFilter : ZZTransFilter
@end

2、在 MyFilter 的load方法中,注册拦截器

这里的name,你可以直接传入与 RouterPath(@"name") 同样的那name,这样这个拦截器只对这个路由起作用

你也可以传入一个正则表达式,来匹配与之相符的所有跳转
比如:RouterFilter(@"name1|name2")
如果你想匹配所有的路由,可以用:RouterFilter(@"*")但是,为*的过滤器只能有一个,多个会以最后加载的为主

+ (void)load {
    RouterFilter(@"name")
}

3、实现拦截的方法

其中参数:
url -- 路由的name,即调用的路由地址
toObject -- 即将跳转的VC,或者可以理解为注册了 RouterPath(@"name") 的对象
param -- 在外部调用时外边传递的参数

返回参数:
需要一个BOOL值,若为true,则通过校验。若为false,则不通过,消息不会转发给后面的转发单元

- (BOOL)willTransRouter:(NSString *)url toViewObj:(id)toObject params:(id)param {
    return YES;
}

说明:
一个路由,如果有多个拦截器拦截,则对所有拦截器的返回结果做与操作,都满足才会继续转发。

至此,你已经可以使用拦截器去拦截路由了

路径跳转

路径跳转是ZZRouter特有的功能,它可以支持如下调用:

ZZRouter.load(@"name1/name2/name3");

这样,可以首先跳转到name1界面,然后跳转到name2界面,最后在跳转到name3界面。
如果其中有自定义的unit的filter的话,就是如下解释:

1、执行name1所有的filter,若通过,执行name1对应的unit
2、执行name2所有的filter,若通过,执行name2对应的unit
3、执行name3所有的filter,若通过,执行name3对应的unit

想要实现路径调用,很重要的一点就是在自定义unit的时候,在自定义跳转结束以后,需要调用complete这个block,并且传入一个BOOL类型的跳转结果。若为YES,则会继续传递下一个路由进行跳转,若为NO,则停止传递。

问题说明

关于路径跳转,有以下几种问题,在此意义说明:

1、对于自定义unit,若不调用complete,则在执行到该路径后,就无法继续执行下去了。所以推荐执行。

2、对于传参,在一开始进行的参数
比如:ZZRouter.load(@"name1/name2/name3",@{@"name":@"123"});
其中的参数会传递到所有的filter和unit

3、对于filter,只会拦截路径上的某一个路由的执行,不会阻断整条路径的执行。
比如路由为:ZZRouter.load(@"name1/name2/name3");
这个时候,对于name2的filter返回的是false,name1和name3返回的都是true,则上面的调用等价于“
ZZRouter.load(@"name1/name3");

想要阻断路径跳转的话,请在unit中,complete传入false

重置(replace)

重制是ZZRouter自带的一个已经实现的转发单元,他的路由是 zz_replace
通过调用 ZZRouter.load(@"zz_replace");
可以直接回到根视图控制器。(可以越过多级push和present)

以下调用:
ZZRouter.load(@"zz_replace/name1");
便是:首先回到根目录,然后在进入name1

一些范例的实现

如果你看到这里,那么恭喜你,你已经知道了ZZRouter的全部功能。
本人针对项目中实际应用的场景,给出几种场景下应用ZZRouter的思路,供大家参考

公共参数

项目里经常会遇到的就是公共参数,对于每一个VC,都需要把一些通用的参数在传递的时候进行赋值。
这样的话,在ZZRouter里面,就是一个Filter

1、自定义公共参数的filter

@interface ParamsFilter : ZZTransFilter
@end

2、注册filter

+ (void)load {
    RouterFilter(@"*")
}

3、实现拦截器

- (BOOL)willTransRouter:(NSString *)url toViewObj:(id)toObject params:(id)param {
    [toObject addParams:……];
    return YES;
}

登陆拦截

对于登陆操作,按理说应该由调用方自己做登陆判断,确认用户成功登录以后,在调用load方法进行跳转。
不过使用ZZRouter也可以实现登录验证。

1、注册一个unit,我们命名为登陆的unit

LoginUnit.h

@interface LoginUnit : ZZTransUnit
@end

LoginUnit.m

+ (void)load {
    RouterUnit(@"login")
    RouterPath(@"login")
}

2、执行登陆逻辑

- (void)dealMessageWithtargetObject:(id)toObject params:(id)param dealFinished:(void (^)(BOOL))complete {

    [YourLoginService login:^(BOOL success){
        complete(success);
    }];
}

3、调用:

ZZRouter.load(@"login/name1");

如此,在登陆成功后,就会执行complete,根据登陆成功与否,决定是否会进入name1

写在后面

ZZRouter还有很多功能等待挖掘。
如果想要联系我,可以给我发简信,或者在下边留言,我会一一回复。

©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341