zoukankan      html  css  js  c++  java
  • 使用runtime 实现weex 跳转原生页面

    一、简述

      最近项目组打算引入weex,并选定了一个页面进行试水。页面很简单,主要是获取数据渲染页面,并可以跳转到指定的页面。跟之前使用RN 相比,weex 确实要简单很多。从下图中我们可以看到,weex 页面需要跳转到原生页面,并且跳转到哪个页面我们可能并不能写死。也就是说只要原生页面之前项目中写过了,那么理论上来说使用weex 可以任意调用。那么问题来了,我原来的页面可能只知道名字,我怎么为那个页面传值呢?比如有个页面orderDetailVC  ,跳转时需要传入orderId,即orderDetailVC.orderId = @"123"; 

    二、思考

      可能最直接的想法就是直接原生给weex 提供一个方法,让weex 传入orderId,然后再push。但是如果明天我们需要跳转到另一个页面merchantDetailVC呢?它需要的不是orderId了,可能是一个merchantId,甚至更多参数。那怎么才能实现任意跳转呢?我的想法是,项目是我写的,需要跳转到哪个类,那么这个类名我肯定是清楚的,并且这个类应该需要什么参数我也是清楚的。只不过我可能不知道怎么用weex 把它参数传过去而已。如果知道了类名就意味着我知道了这个类,我能找到这个类,那么我就知道这个类有哪些属性了,这个类的所有属性我都能拿到,只不过有些是我需要给它赋值的,有些是不需要处理的。

    三、实现

      整体的思路是:原生给weex 提供一个通用的跳转方法。参数是类名和属性字典。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    //控制器相关
    /*
     vcName: 页面名称
     param:页面所需参数(如原来的页面需要传递小区id,工单号等等,字典形式传过去,key 与页面所需参数名称一致即可。
     */
    -(void)pushViewController:(NSString *)vcName param:(NSDictionary *)param;
     
    /*
     将APP 当前展示的页面pop
     */
    -(void)popViewController;
     
    /*
     vcName: 页面名称
     param:页面所需参数(如原来的页面需要传递小区id,工单号等等,字典形式传过去,key 与页面所需参数名称一致即可。
     */
    -(void)presentViewController:(NSString *)vcName param:(NSDictionary *)param finish:(WXModuleCallback)callback;
     
    /*
     将APP 当前展示的页面dismiss
     */
    -(void)dismissViewController:(WXModuleCallback)callback;

     提供方法后weex 可以这样调用:

    确定了方案之后,剩下唯一的事情就是如何实现给weex 提供的方法。代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    -(void)pushViewController:(NSString *)vcName param:(NSDictionary *)param{
         
        //获取类
        Class vcClass = NSClassFromString(vcName);
        if (vcClass == nil) {
            return;
        }
         
        BaseViewController *vc = [[vcClass alloc] init];
        vc.hidesBottomBarWhenPushed = YES;
         
        //属性数量
        unsigned int count = 0;
         
        //获取属性列表
        objc_property_t *plist = class_copyPropertyList(vcClass, &count);
         
         
        for (int i = 0; i<count; i++) {
             
            //取出属性
            objc_property_t property = plist[i];
             
            //取出属性名称
            NSString *propertyName =  [NSString stringWithUTF8String:property_getName(property)];
             
            //以这个属性名称作为key ,查看传入的字典里是否有这个属性的value
            if (param[propertyName]) {
                 
                [vc setValue:param[propertyName] forKey:propertyName];
            }
        }
     
        //释放
        free(plist);
         
        //获取当前页面控制器
        /*
         获取当前页面控制器是根据响应链获取的。
         */
        UIViewController *currentVC = [Utils getCurrentVC];
        if ([currentVC isKindOfClass:[UINavigationController class]]) {
            [(UINavigationController *)currentVC pushViewController:vc animated:YES];
        }else{
            [currentVC.navigationController pushViewController:vc animated:YES];
        }
    }
  • 相关阅读:
    恰瓜恰到自己家
    在 D 天内送达包裹的能力
    火车编组
    排列小球
    为什么这段时间一直在做算法题呢
    leetcode 221 ,3,480,6,54,46,209,495
    leetcode 684.354,133,207,121,63,64,jz46,120,357
    leetcode 130,200,207,329,491,494,416,547,51
    flink单机搭建以及快速编写一个简单的java job demo运行
    leetcode 437,450,508,513,538,623,652,654,662
  • 原文地址:https://www.cnblogs.com/aeexiaoqiang/p/6529300.html
Copyright © 2011-2022 走看看