美文网首页
Objective-C实现界面间的路由跳转

Objective-C实现界面间的路由跳转

作者: hexuren | 来源:发表于2020-05-12 14:13 被阅读0次

将界面的跳转操作都放在一个地方统一处理
不用关心当前控制器是什么,不用繁琐的引用文件,
将各模块之间隔离开来
接收参数的属性不需要暴露在h文件中

用途

通过控制器的 类名字符串 来索引 打开该控制器

路由支持

  • push
  • present
  • push storyboard的vc
  • present storyboard的vc
  • scheme 链接打开vc
  • link 链接打开vc
  • 参数传递
  • 数据回调上一个界面
  • 登录状态判断
  • 同一个界面是刷新还是重新打开
  • 控制器映射表

实现

初始配置
    ZMRouter * router = [ZMRouter sharedRouter];
    router.url_scheme = @"ZMRouter";
    打开链接 可通过该key查找控制器名字 如果为空取链接的host信息
    router.linkURLPageKey = @"page";
    present出来的vc加载在该控制器上
    router.presentNavcClass = [ZMBaseNavigationViewController class];
    [router setNeedLoginBlock:^BOOL{
        NSLog(@"做登录判断, 未登录去做登录操作, 这里返回YES表示 已登录");
        
        return YES;
    }];
    //外部链接打开 判断是否单独做处理 YES继续下一步跳转处理
    [router setURLOpenHostContinuePushBlock:^BOOL(NSString * _Nonnull vchost, NSDictionary * _Nonnull params) {
        if([vchost isEqualToString:@"tabbar"]){
            NSLog(@"假设是tabbar 标签栏切换操作 不做下一步处理 : %@",params);
            return NO;
        }
        return YES;
    }];
    
    //key是控制器的名字 如果是Storyboard 带上SB的名字 
    //value 可以是字符串 可以是 number类型 可以是包含字符串和number的数组
    [router addMapperDic:@{
        @"ZMColorViewController":@"color",
        @"ZMScrollViewController":@(1000),
        @"ZMTableViewController":@[@"table",@(1001)],
        @"ZMDetailsViewController":@[@"detail",@(1002)],
        @"ZMOrderViewController":@"order",
        @"Main.ZMDebugSBViewController":@"debug"
    }];
Push
[ZMRouter zm_pushVCName:@"ZMColorViewController"]
[ZMRouter zm_pushVCName:@"Main.ZMDebugSBViewController"]

Present

[ZMRouter zm_presentVCName:@"ZMTableViewController"]
[ZMRouter zm_presentVCName:@"Main.ZMDebugSBViewController"]

Scheme

[ZMRouter zm_openSchemeURL:@"ZMRouter://detail?id=12&type=22"].

Link

[ZMRouter zm_openLinkURL:@"https://order?orderID=10086"].

参数传递 及回调

[ZMRouter zm_pushVCName:@"order"
                         params:@{@"orderID":@(8888)}
                      callBlock:^(id  _Nullable passResult) {
            NSLog(@"%@",passResult);
        }]

回调
if(self.routerCallBlock){
        self.routerCallBlock([NSString stringWithFormat:@"call back other order ID: %zd",self.orderID]);
    }

控制器中ZMRouterProtocol设置

接收参数

- (void)zm_routerPassParamViewController:(id)parameters;

该页面是否要显示 将要显示控制器 配置参数

比如:如果当前再订单详情页 当前订单界面是否刷新还是再叠加一个新的界面

- (BOOL)zm_routerReloadViewController_shoudShowNext:(id)parameters;

是否需要登录

- (BOOL)zm_routerNeedLogin;

例子:

-(void)zm_routerPassParamViewController:(id)parameters{
    NSLog(@"接收到的参数 : %@",parameters);
    
    if([parameters isKindOfClass:[NSDictionary class]] &&
       parameters[@"orderID"]){
        self.orderID = [parameters[@"orderID"] integerValue];
    }
}

- (BOOL)zm_routerReloadViewController_shoudShowNext:(id)parameters{
    if([parameters isKindOfClass:[NSDictionary class]] &&
       parameters[@"orderID"]){
        NSInteger orderID = [parameters[@"orderID"] integerValue];
        if(orderID == self.orderID){
            NSLog(@"同样的订单ID 刷新当前界面");
            return NO;
        }
    }
    return YES;
}

....
..
.

- (void)pushEvent{
    
    __weak typeof(&*self)weakSelf = self;
    
    [ZMRouter zm_pushVCName:@"order"
                     params:@{@"orderID":@(arc4random()%1000+1000)}
                  callBlock:^(id  _Nullable passResult) {
        
        self.orderInfo.text = [NSString stringWithFormat:@"%@\n%@",passResult,@(weakSelf.orderID).stringValue];
    }];
}

- (void)sameEvent{
    
    __weak typeof(&*self)weakSelf = self;
    
    [ZMRouter zm_pushVCName:@"order"
                     params:@{@"orderID":@(self.orderID)}
                  callBlock:^(id  _Nullable passResult) {
        
        self.orderInfo.text = [NSString stringWithFormat:@"%@\n%@",passResult,@(weakSelf.orderID).stringValue];
    }];
}

- (void)callbackEvent{
    
    if(self.routerCallBlock){
        self.routerCallBlock([NSString stringWithFormat:@"call back other order ID: %zd",self.orderID]);
    }
    
    [self.navigationController popViewControllerAnimated:YES];
}

项目地址:https://github.com/hexuren/ZMRouter

相关文章

  • Objective-C实现界面间的路由跳转

    将界面的跳转操作都放在一个地方统一处理不用关心当前控制器是什么,不用繁琐的引用文件,将各模块之间隔离开来接收参数的...

  • 路由模块

    路由模块控制vue内容显示,路由跳转,组件间的跳转。就是一个页面中实现不同组件内容的切换 1. 安装路由模块 ...

  • 课程三

    1.导航器: 路由进行跳转 界面获取到跳转传递的参数: 界面返回上一页或者跳转到指定的界面

  • ARouter笔记

    ARouter是什么? ARouter是:阿里巴巴自研路由框架,主要解决组件间、模块间的 界面跳转 问题。 ARo...

  • Flutter 路由

    flutter 路由 页面跳转 在flutter中界面就是组件Flutter 中的路由通俗的讲就是页面跳转。在 F...

  • APP 之间的跳转

    App之间跳转实现 在谈App内部的路由之前,先来谈谈在iOS系统间,不同App之间是怎么实现跳转的。 1. UR...

  • antd pro v5 登录流程

    涉及的主要文件 未登录时,路由跳转到登录界面 非登陆界面 登录界面

  • Flutter router

    在Flutter开发的页面间实现跳转的话,一切都离不开Navigator,系统提供了Navigator管理界面跳转...

  • 26.vue-router的使用2

    9.编程式路由导航 作用:不借助实现路由跳转,让路由跳转更加灵活 具体编码://$rou...

  • 解决vue路由跳转页面不刷新的问题

    解决vue路由跳转页面不刷新的问题 通过路由传参跳转界面,页面没有刷新解决方法:在 router-view 中加 ...

网友评论

      本文标题:Objective-C实现界面间的路由跳转

      本文链接:https://www.haomeiwen.com/subject/xdebnhtx.html