以往的项目中,我们都是通过import "xxxViewcontroller.h"
,然后进行push
或者present
操作进行ViewController
的跳转。上周五快下班时,在网上搜索了一些资料,参考了一些大神的博客,简单的了解了一下iOS
中的route机制
,大家可以参考这篇文章,一步步构建iOS路由。
准备:HHRouter库
第一阶段:不带参数的跳转
在AppDelegate.m
中进行注册,如下
[[HHRouter shared] map:@"first" toControllerClass:[FirstViewController class]];
在ViewController.m
文件中进行跳转,如下
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self presentViewController:[[HHRouter shared] matchController:@"first"]
animated:YES completion:nil];
}
我们通过[[HHRouter shared] matchController:@"first"]
来获取已经注册的ViewController
.
第二阶段:传递参数
在AppDelegate.m
中进行注册,如下
[[HHRouter shared] map:@"/second/:secondId/" toControllerClass:[SecondViewController class]];
second
是获取已经注册的ViewController
的字段名;secondId
是传递参数的字段名。
普通传递参数
跳转到SecondViewController
时做如下操作
UIViewController *vc = [[HHRouter shared] matchController:@"/second/testttttt/"];
[self presentViewController:vc animated:YES completion:nil];
其中,testttttt
是你需要传递的参数。
在SecondViewController
中进行如下测试
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"--- %@ ---",self.params[@"secondId"]);
}
输出结果
2017-12-25 10:23:57.971538+0800 RouterTest[771:166331] --- testttttt ---
通过URL查询参数
跳转到SecondViewController
时做如下操作
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
UIViewController *vc = [[HHRouter shared] matchController:@"/second/testttttt/?testURL=19001"];
[self presentViewController:vc animated:YES completion:nil];
}
在SecondViewController
中进行如下测试
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"--- %@ ---",self.params[@"secondId"]);
NSLog(@"--- %@ ---",self.params[@"testURL"]);
}
输出结果
2017-12-25 10:28:56.599595+0800 RouterTest[780:167956] --- testttttt ---
2017-12-25 10:28:56.599674+0800 RouterTest[780:167956] --- 19001 ---
说明
self.params
来源于
@interface UIViewController (HHRouter)
@property (nonatomic, strong) NSDictionary *params;
@end
使用 URL schemes
自定义URL schemes
为urls://
,
在跳转的时候,做如下操作
UIViewController *vc = [[HHRouter shared] matchController:@"urls://second/testttttt/"];
[self presentViewController:vc animated:YES completion:nil];
测试方法和上面的一样。
使用block
在HHRouter.h
可以看到下面的代码
- (void)map:(NSString *)route toBlock:(HHRouterBlock)block;
- (HHRouterBlock)matchBlock:(NSString *)route;
- (id)callBlock:(NSString *)route;
说明使用HHRouter
也可以传递block
.具体的使用方法viewController
之间的跳转类似。
注册block
,如下
[[HHRouter shared] map:@"testBlock" toBlock:^id(NSDictionary *params) {
NSLog(@"paramas:%@",params);
id data;
return data;
}];
如上,因为block的返回值类型是id,所以你可以返回任意类型的值。
调用block
有两种方式
- 方式一
HHRouterBlock block = [[HHRouter shared] matchBlock:@"testBlock"];
block(@{@"key":@"valeu001"});
NSLog(@"Style1: %@ ",block);
控制台输出
2017-12-25 13:40:28.818646+0800 RouterTest[1137:231360] paramas:{
block = "<__NSGlobalBlock__: 0x104bdc160>";
key = valeu001;
route = testBlock;
}
- 方式二
NSLog(@"Style2: %@ +++",[[HHRouter shared] callBlock:@"testBlock"]);
控制台输出
2017-12-25 13:40:28.908387+0800 RouterTest[1137:231360] paramas:{
block = "<__NSGlobalBlock__: 0x104bdc160>";
route = testBlock;
}
两种方式的区别在于:第一种方式,可以给block一个返回值,而第二种没有返回值。
这是Demo,已经上传到我的GitHub上了。