iOS 组件化的时代到临
YFRouter 是一个高效、轻量级的路由系统,帮你处理一系列的 URL Router 问题。
强烈建议配合 YFMediator 使用!!
- 2016.12.25 增加 URL - Object 绑定
- Demo
[YFRouter registerURL:@"YF:///feed/detail" handler:^(NSDictionary *params) {
YFDebug(@"%@", params);
}];
[YFRouter route:@"YF:///feed/detail?id=001" params:nil];
-------------------
{
YFSchemeKey = YF;
YFPathKey = @"feed/detail";
YFURLKey = "YF:///feed/detail?id=001";
id = 001;
}
-------------------
params
自带 三个 Key
extern NSString * const YFRouterSchemeKey;
extern NSString * const YFRouterPathKey;
extern NSString * const YFRouterURLKey;
[YFRouter registerURL:@"YF:///feed/detail/:id" handler:^(NSDictionary *params) {
YFDebug(@"%@", params);
}];
[YFRouter route:@"YF:///feed/detail/001" params:nil];
-------------------
{
YFSchemeKey = YF;
YFPathKey = @"feed/detail";
YFURLKey = "YF:///feed/detail?id=001";
id = 001;
}
-------------------
[YFRouter registerURL:@"YF:///feed/detail" handler:^(NSDictionary *params) {
YFDebug(@"%@", params);
}];
[YFRouter route:@"YF:///feed/detail?id=001" params:@{@"city" : @"shanghai"}];
-------------------
{
YFSchemeKey = YF;
YFPathKey = @"feed/detail";
YFURLKey = "YF:///feed/detail?id=001";
id = 001;
city = shanghai;
}
-------------------
通过 URL
获取对象,有两种方式,一种是通过绑定一个 Object Handler
来获取 Object
,另一种是直接将 URL
和 Object
绑定。
+ objectForRoute:params:
获取的是 YFObject
,通过 value
属性获取绑定的 Object
,通过 params
获取传递的参数。
[YFRouter registerURL:@"YF:///alert" objectHandler:^id(NSDictionary *params) {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:params[@"title"] message:params[@"message"] preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil]];
return alert;
}];
UIAlertController *alert = [UIAlertController alertControllerWithTitle:params[@"title"] message:params[@"message"] preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil]];
[YFRouter registerURL:@"YF://alert" object:alert];
// 这种写法也是可以的
// [YFRouter objectForRoute:@"YF://alert" params:@{@"title" : @"Hello", @"message" : @"World"}];
UIAlertController *alert = [YFRouter objectForRoute:@"YF://alert?title=Hello&message=World" params:nil].value;
[self presentViewController:alert animated:YES completion:nil];
YFRouter 有一个默认的 Scheme YFRouterDefaultScheme
,住注册 URL 的时候如果 URL 不含有 Scheme,则会使用 YFRouter 默认的 Scheme。
extern NSString * const YFRouterDefaultScheme;
[YFRouter registerURL:@"my:///feed/detail" handler:handler]; // my:///feed/detail
[YFRouter registerURL:@"/feed/detail" handler:handler]; // YFRouterScheme:///feed/detail
标准的 Scheme 定义是 scheme://
,URI 是 /path
,完整的 URL 是 scheme:///path
在 YFRouter 中 URLPattern 是否以 /
开始都是可以的,即:
// 在 YFRouter 中他们是代表同一个 URL
scheme://feed/detail
scheme://feed/deatil/
scheme:///feed/detail
YFRouter 中有一个选项 shouldFallbackToLastHandler
,默认是 NO
+ (void)shouldFallbackToLastHandler:(BOOL)shouldFallback;
我们在 YFRouter 中注册中里这个 URL
YF:///feed
我们现在让 shouldFallbackToLastHandler
设置为 NO
,然后 Route 到这个 URL
YF:///feed/detail
会发现找不到对应的 Handler,因为关闭 shouldFallbackToLastHandler
之后,就是开启了严格匹配模式,只会找对应 URL YF:///feed/detail
的 Handler。
使用这个方法注册一个 UcaughtHandler
,所有未匹配到的 URL 都会进入这个方法。
+ (void)registerUncaughtHandler:(YFRouterHandlerBlock)handler;
pod "YFRouter"
建议在项目中利用默认 Scheme
和 Target Action
的方式来处理本地 URL
[YFRouter registerURL:@"/:target/:action" handler:^(NSDictionary *params) {
id target = params[@"target"];
id action = params[@"action"];
// 根据 target 和 action 来处理业务
// ...
}];
[YFRouter route:@"/user/login" params:...];
[YFRouter route:@"/user/search?text=laizw" params:...];
laizw, i@laizw.cn
YFRouter is available under the MIT license. See the LICENSE file for more info.