利用route机制来进行ViewController之间的跳转

2018-02-27 11:16:04来源:https://www.jianshu.com/p/515aee9c4ea4作者:ZYiDa人点击

分享


以往的项目中,我们都是通过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 schemesurls://,
在跳转的时候,做如下操作


 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上了。


不足的地方,还请多多指教。






最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台