HGoto 1.2.8

HGoto 1.2.8

Maintained by jumperb.



 
Depends on:
Hodor/Feature>= 0
Hodor/Defines>= 0
 

HGoto 1.2.8

  • By
  • zct

What

这是一个非常小的app内路由工具,你可以用他来处理来自推送,urlschema,universal url,深链,网页调用,app的消息中心的消息或者调用,还可以用于服务器下发跳转逻辑,例如banner。相比其他同类库,它具有如下特点

  • 支持自由,所见即所得的路由处理函数
  • 支持自动跳转和手动跳转
  • 支持参数自动填充
  • 支持参数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对象,并且在不同地方采用不同的跳转方式