iOS组件化Router简单实现
Github地址:https://github.com/AndrewXF/XFRouter
// 组件对外公开接口, m组件名, i接口名, p(arg)接收参数, c(callback)回调block
#define XFROUTER_EXTERN_METHOD(m,i,p,c) + (id) routerHandle_##m##_##i:(NSDictionary*)arg callback:(id)callback
@interfaceXFRouter :NSObject
+(void)openURL:(NSString*)stringUrl arg:(NSDictionary*)param error:(NSError*)error callBack:(void(^)(void))callBack;
@end
#import "XFRouter.h"
#import
#import
@implementation XFRouter
#pragma mark - public methods
+ (instancetype)sharedInstance
{
staticXFRouter*mediator;
staticdispatch_once_tonceToken;
dispatch_once(&onceToken, ^{
mediator = [[XFRouteralloc]init];
});
returnmediator;
}
+(void)openURL:(NSString*)stringUrl arg:(NSDictionary*)param error:(NSError*)error callBack:(void(^)(void))callBack
{
if(![stringUrlcontainsString:@"router://"]) {
NSLog(@"不合法的router");
return;
}
NSString*moduleStr =nil;
NSString*actionStr =nil;
if(!param) {
NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
NSArray*urlElementsArrary = [stringUrlcomponentsSeparatedByString:@"//"];
NSString*pathStr = [urlElementsArrarylastObject];
if([stringUrlcontainsString:@"?"]) {
NSArray*paramsArrary = [stringUrlcomponentsSeparatedByString:@"?"];
NSString*paramsStr = [paramsArrarylastObject];
for(NSString*paramStrin[paramsStrcomponentsSeparatedByString:@"&"]) {
NSArray*elts = [paramStrcomponentsSeparatedByString:@"="];
if([eltscount] <2)continue;
[paramssetObject:[eltslastObject]forKey:[eltsfirstObject]];
}
NSArray*pathStrArrary = [pathStrcomponentsSeparatedByString:@"?"];
pathStr = [pathStrArraryfirstObject];
}
param = params;
NSArray*pathElementsArrary = [pathStrcomponentsSeparatedByString:@"/"];
moduleStr = [pathElementsArraryfirstObject];
actionStr = [pathElementsArrarylastObject];
}else
{
if([stringUrlcontainsString:@"?"]) {
NSLog(@"不合法的router");
return;
}
NSArray*urlElementsArrary = [stringUrlcomponentsSeparatedByString:@"//"];
NSString*pathStr = [urlElementsArrarylastObject];
NSArray*pathElementsArrary = [pathStrcomponentsSeparatedByString:@"/"];
moduleStr = [pathElementsArraryfirstObject];
actionStr = [pathElementsArrarylastObject];
}
NSString*routerStr = [NSStringstringWithFormat:@"routerHandle_%@_%@:callback:",moduleStr,actionStr];
ClasstargetClass =NSClassFromString(moduleStr);
SELaction =NSSelectorFromString(routerStr);
((void(*)(id,SEL,id,id))objc_msgSend)(targetClass, action,param,callBack);
if(callBack) {
callBack();
}
}
@end
组件代码使用代码
#import
@interfaceTestModule :NSObject
@end
#import "TestModule.h"
#import "TestModuleViewController.h"
#import "TestModuleViewController1.h"
#import "XFRouter.h"
#import "XFNavigationTool.h"
@implementation TestModule
XFROUTER_EXTERN_METHOD(TestModule, gotoView1, arg, callback) {
NSLog(@"gotoView1 get arg=%@",arg);
TestModuleViewController *view = [[TestModuleViewController alloc] init];
[[XFNavigationTool currentNavigationVC] pushViewController:view animated:YES];
return nil;
}
XFROUTER_EXTERN_METHOD(TestModule, gotoView2, arg, callback) {
NSLog(@"gotoView2 get arg=%@",arg);
TestModuleViewController1 *view = [[TestModuleViewController1 alloc] init];
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:view animated:YES completion:nil];
return nil;
}
@end