什么是HGoto?
这是一个非常小型的app内路由工具,可用于处理来自推送、urlschema、通用URL、深链、网页调用、app的消息中心消息或调用的消息,还可用于服务器下发的跳转逻辑,例如横幅。与其他同类库相比,它具有以下特点
- 支持自由、所见即所得的路由处理函数
- 支持自动跳转和手动跳转
- 支持参数自动填充
- 支持参数keymap
- 支持“二段跳”,即next关键字
- 支持跳转后返回并携带数据
- 支持数据暂存,类似剪贴板
使用方法
安装
在Podfile中添加pod 'HGoto'并更新
配置
实现HGotoConfig协议
#import "HGoTo.h"
@interface HGotoConfigIMP : NSObject <HGotoConfig>
@end
#import "HGotoConfigIMP.h"
#import <HCommon.h>
@implementation HGotoConfigIMP
HRegForProtocal(HGotoConfig)
- (NSString *)appSchema
{
return @"HGoto://";
}
- (UINavigationController *)navi
{
return [UIApplication navi];
}
@end
注意其中HRegForProtocal(HGotoConfig) 是一个注册方式,告诉上下文,使用这个协议的对象来查找它
基本使用
如果您想向BViewController添加带有参数的跳转,链接设计如下
你的schema://b?pa=1&pb=2&pc=3 你需要:1.在VC的imp里注册路径HGotoReg(@"b") 2.如果需要处理参数,需要编写参数处理函数hgoto_xxxxx
@implementation BViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"B";
self.view.backgroundColor = [UIColor blueColor];
UITextView *textView = [[UITextView alloc] initWithFrame:self.view.bounds];
self.view = textView;
textView.text = [NSString stringWithFormat:@"pa=%@,pb=%d,pc=%@", self.pa,self.pb,self.pc];
}
@end
//有一定逻辑的情况下,建议放在一个扩展里面实现路由
@implementation BViewController (hgoto)
HGotoReg(@"b")
+ (void)hgoto_pa:(NSString *)pa pb:(NSString *)pb pc:(NSString *)pc finish:(finish_callback)finish
{
BViewController *vc = [HGoto autoRoutedVC];
vc.pa = pa;
vc.pb = [pb intValue];
vc.pc = @([pc intValue]);
vc.gotoCallback = finish;
}
@end
注意:[HGoto autoRoutedVC] 是已经为您创建好的VC。3.在浏览器地址栏中输入“你的schema://b?pa=1&pb=2&pc=3”,注意确认您的schema已在info.plist的url-types中配置。
参数处理函数模板
需要处理参数时任意选择一个模式,其中模式1的函数方法名由路由的入参决定,当然,参数不足也无妨
模式1 + (void)hgoto_p1:(NSString *)p1 p2:(NSString *)p2 p3:(NSString *)p3 finish:(finish_callback)finish 模式1 + (void)hgoto_P1:(NSString *)p1 p2:(NSString *)p2 p3:(NSString *)p3 模式2 + (void)hgotoWithParams:(NSDictionary *)paramMap finish:(finish_callback)finish 模式2 + (void)hgotoWithParams:(NSDictionary *)paramMap 模式3 + (void)hgoto:(NSString *)params finish:(finish_callback)finish 模式3 + (void)hgoto:(NSString *)params 模式4 + (void)hgotoWithFinish:(finish_callback)finish 模式4 + (void)hgoto
有的带有回调,有的不带回调,根据需要使用即可
手动处理跳转请求
若需要完全自行创建对象,设置参数,执行跳转,则直接使用HGotoOpt_ManualRoute这个注解即可
@implementation CViewController1
HGotoReg2(@"c1",HGotoOpt_ManualRoute)
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"C1";
}
+ (void)hgoto_pa:(NSString *)pa
{
[[UIApplication navi] pushViewController:[CViewController1 new] animated:YES];
}
@end
请注意,添加该参数后,跳转目的地不仅是VC,还可以是任意NSObject子类,若将此用作命令或方法调用也是可以的
自动填充参数
此类赋值没有太大意义
BViewController *vc = [HGoto autoRoutedVC];
vc.pa = pa;
vc.pb = [pb intValue];
vc.pc = @([pc intValue]);
vc.gotoCallback = finish;
如果要省略,可以使用HGOtoOpt_AutoFill这个注解
@implementation CViewController3
HGotoReg2(@"c3",HGOtoOpt_AutoFill)
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"C3";
UITextView *textView = [[UITextView alloc] initWithFrame:self.view.bounds];
self.view = textView;
textView.text = [NSString stringWithFormat:@"pa=%@,PB=%d,pc=%@", self.pa,self.PB,self.pc];
}
@end
这样,就可以省略参数处理函数
参数映射
在HGOtoOpt_AutoFill模式下,如果传入参数与你定义的属性名不完全一致,则需要进行参数映射,使用HGOtoOpt_KeyMap这个注解即可
@implementation CViewController4
HGotoReg2(@"c4", HGOtoOpt_AutoFill, HGOtoOpt_KeyMap((@{@"pa":@"eee",@"pb":@"FFF",@"pc":@"ggg"})))
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"C4";
UITextView *textView = [[UITextView alloc] initWithFrame:self.view.bounds];
self.view = textView;
textView.text = [NSString stringWithFormat:@"eee=%@,FFF=%d,ggg=%@", self.eee,self.FFF,self.ggg];
}
@end
唯一VC处理
有一个页面叫CViewController2,这个页面较重,页面栈中只允许出现一个,若在跳转时需要回退,可使用HGOtoOpt_AutoPop这个注解处理此类需求
@implementation CViewController2
HGotoReg2(@"c2",HGOtoOpt_AutoPop)
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"C2";
UITextView *textView = [[UITextView alloc] initWithFrame:self.view.bounds];
self.view = textView;
textView.text = self.pa;
}
- (void)setPa:(NSString *)pa
{
_pa = pa;
[(UITextView *)self.view setText:pa];
}
+ (void)hgoto_pa:(NSString *)pa
{
CViewController2 *vc = [HGoto autoRoutedVC];
vc.pa = pa;
}
@end
可以使用以下代码进行测试
[HGoto route:@"HGoto://c2?pa=oldoldoldoldoldoldoldoldoldoldoldold&pb=2&pc=3"];
[HGoto route:@"HGoto://b"];
dispatchAfter(2, ^{
[HGoto route:@"HGoto://c2?pa=newnewnewnewnewnewnewnewnewnewnewnew&pb=2&pc=3"];
});
直接获取VC
默认我们的跳转方式都是push,若需要不同的跳转方式,则需要自行实现跳转,但对于同一VC,有时候需要push,有时候需要pop,此时可以使用此方法
+ (UIViewController *)getViewController:(NSString *)path;
直接获取到VC对象,并在不同位置使用不同的跳转方式