ios 知识点实用工具Swift&Objective-C

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

2017-12-25  本文已影响118人  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上了。

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

上一篇 下一篇

猜你喜欢

热点阅读