iOS页面跳转方式(2)—— HHRouter
URL Router 可以将 UIViewController 映射成 URL,从而支持通过 URL 进行界面跳转,类似 Web 一样。URL Router 有着许多切实的好处。
一、URL Router优势
1、减少 UIViewController 之间的耦合。在没有 URL Router 的世界,如果 aViewController 需要跳转到 bViewController,就必须依赖于后者,这很容易就造成错综复杂的依赖链。引入 URL Router 后,这些链条自然就被斩断。
需求场景:实现由controllerA跳转到controllerB,且为controllerB的各项属性完成赋值操作(bVC的属性变化较频繁)。
a. 在常规开发中,为了适应controllerB不断变化的属性,我们需要同时修改controllerA中的跳转方法(因跳转依赖后者,即controllerB)和controllerB的属性声明,controllerA和controllerB的耦合性较大,在实现需求的过程中增价了开发的强度。
b. 使用URL Router后,应对controllerB不断变化的属性,我们只需要修改controllerB即可,controllerB需要的各项参数可以通过URL Router的参数完成传递,大大降低了两者的耦合性。
2、使用URL Router后,每个界面都拥有唯一且不重复的 URL ,你将更容易实现这些以下需求:Push 打开指定的界面、追踪用户浏览记录、开放 URL Scheme等。
二、HHRouter使用详解
1、这里使用cocoaPods演示使用过程,新建项目RouterDemo,编辑Podfile文件如下:
platform :ios, '7.0'
target 'RouterDemo' do
pod 'HHRouter', '~> 0.1.8'
end
执行cocoa pods安装命令,安装HHRouter。
2、在ViewController.m引入头文件:
#import <HHRouter/HHRouter.h>
添加如下测试方法:
- (void)testMethod
{
[[HHRouter shared] map:@"/user/:userId/" toControllerClass:[UserViewController class]];
UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(20, 100, 100, 40)];
[self.view addSubview:btn];
[btn setTitle:@"Skip" forState:UIControlStateNormal];
[btn setTitleColor:[UIColor purpleColor] forState:UIControlStateNormal];
[btn addTarget:self action:@selector(skip) forControlEvents:UIControlEventTouchUpInside];
}
- (void)skip
{
UIViewController *viewController = [[HHRouter shared] matchController:@"/user/10/"];
// XCTAssertEqualObjects([viewController class], [UserViewController class]);
// XCTAssertEqualObjects(viewController.params[@"route"], @"/user/1/");
// XCTAssertEqualObjects(viewController.params[@"userId"], @"1");
[self.navigationController pushViewController:viewController animated:YES];
}
即可利用“/user/10/”为链接跳转到UserViewController,且传递参数userId=10。
3、在UserViewController中接收url传过来的参数;
a. 在UserViewController.h中添加属性
@property (nonatomic, strong) NSDictionary *params;
b. 在UserViewController.m添加实现
- (void)setParams:(NSDictionary *)params
{
_params = params; // 为私有属性赋值
NSLog(@"Params: %@", params);
}
三、HHRouter原理分析
更多详情请参照git文档:https://github.com/Huohua/HHRouter
笔者根据HHRouter的原理,使用值传递、面向协议的方式,基于swift4.0对其进行了重写,有兴趣的同学可以参考:https://github.com/Andy-Swift/ASRouterDemo
如有不当之处,欢迎各位同学讨论指导。