功能的组件化,其实最大的目的就是为了降低功能之前的依赖,降低耦合度。
现在有2种组件化的方式:
1.URL Schema:
推荐JLRoutes,蘑菇街也按照自己的业务需要写了一个MGJRouter,咱们也可以按照自己的业务需要写一款Router。JLRoutes是遍历查找的,MGJRouter与HHRouter是匹配查找,可以说说各有千秋。
#import"JLRoutes.h"
- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url {
return [JLRoutesrouteURL:url];
}
- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation {
return [JLRoutesrouteURL:url];
}
- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url options:(NSDictionary*)options {
return [JLRoutesrouteURL:url];
}
//解析testApp://home
[JLRoutesaddRoute:@"/home"handler:^BOOL(NSDictionary*_Nonnullparameters) {
//处理跳转到home界面
returnYES;
}];
//通用导航跳转
[JLRoutesaddRoute:@"/navPush/:Controller"handler:^BOOL(NSDictionary*_Nonnullparameters) {
//通过runtime获取到Controller类型,然后通过runtime对property赋值,最后push
returnYES;
}];
2.面向协议编程:
可以借助强大的Objection来实现。
1.定义好protocol
2.将vc绑定到protocol
3.通过protocol拿到vc的类型,不需要依赖vc
4.属性与接口都在protocol定义好
5.在vc中实现协议即可
@protocolTTTProtocolTest
@property(nonatomic, assign)NSUInteger myIndex;
@end
@implementationTTTObjectionModule
- (void)configure {
[selfbind:[ViewController class] toProtocol:@protocol(TTTProtocolTest)];
}
@end
JSObjectionInjector *injector = [JSObjection defaultInjector];// [1]
injector = injector ? : [JSObjection createInjector];// [2]
injector = [injector withModule:[[TTTObjectionModule alloc] init]];// [3]
[JSObjectionsetDefaultInjector:injector];// [4]
UIViewController *vc = [[injectorgetObject:@protocol(TTTProtocolTest)] new];// [2]
vc.myIndex=3;
UINavigationController*nc = [[UINavigationController alloc] initWithRootViewController:vc];
self.window.rootViewController= nc;
网友评论