使用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 ];
     }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值