HGoto 1.2.8

HGoto 1.2.8

jumperb维护。



 
依赖
Hodor/Feature>= 0
Hodor/Defines>= 0
 

HGoto 1.2.8

  • 作者:
  • zct

什么是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对象,并在不同位置使用不同的跳转方式