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];
        }
    }
  • 相关阅读:
    我的WCF之旅(1):创建一个简单的WCF程序
    与众不同 windows phone (15) Media(媒体)之后台播放音频
    与众不同 windows phone (14) Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成
    与众不同 windows phone (10) Push Notification(推送通知)之推送 Tile 通知, 推送自定义信息
    与众不同 windows phone (17) Graphic and Animation(画图和动画)
    与众不同 windows phone (5) Chooser(选择器)
    与众不同 windows phone (26) Contacts and Calendar(联系人和日历)
    与众不同 windows phone (7) Local Database(本地数据库)
    与众不同 windows phone (19) Device(设备)之陀螺仪传感器, Motion API
    与众不同 windows phone (16) Media(媒体)之编辑图片, 保存图片到相册, 与图片的上下文菜单“应用程序...”和“共享...”关联, 与 Windows Phone 的图片中心集成
  • 原文地址:https://www.cnblogs.com/aeexiaoqiang/p/6529300.html
Copyright © 2011-2022 走看看