iOS路由协议
2019-06-26 本文已影响0人
火三君
一、常规的路由协议
最近在看项目里面的路由协议,发现一个比较有意思的东西,在我之前接触到的项目里面,路由协议通常是会有一个单例来作为中转来实现在项目的任何地方都可以进行Push或者Present,使用这种办法实现路由协议有个问题就是,这个单例需要维护,随着项目复杂度的上升,会越来越难维护。当然也有好处,好处就是可以对项目里面所有的路由跳转有一个强控制。
二、发现的有趣的东西
而在我当前的项目中,路由的核心是利用了iOS特有的特性,根据UIView和UIViewController都是继承自UIResponder的特性
继承关系图
为UIResponder创建了一个Category,在这个Category里面,主要做了一件事,就是将事件进行传达,无论是来自UIView还是UIViewController的事件,如果没有处理,就会将事件发送给NextResponder,如此一来的话,打通了UIView和UIViewController的隔阂。
#import "UIResponder+BizExtension.h"
static __weak id currentFirstResponder;
@implementation UIResponder (BizExtension)
-(void) routerEventWithName:(NSString *)eventName dataInfo:(NSDictionary *)dataInfo{
[[self nextResponder] routerEventWithName:eventName dataInfo:dataInfo];
}
+(id)currentFirstResponder {
currentFirstResponder = nil;
[[UIApplication sharedApplication] sendAction:@selector(findFirstResponder:)
to:nil
from:nil
forEvent:nil];
return currentFirstResponder;
}
-(void)findFirstResponder:(id)sender {
currentFirstResponder = self;
}
@end
具体流程图下图
image.png
例如:我们可以方便的将UITableViewCell上的事件,直接进行传递,只需要在UIViewController中也同样实现相应的协议,即可处理UITableViewCell上的事件,而不需要写Block或者Delegate去单独处理。