一、简述

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

二、思考

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

三、实现

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

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

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

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

  1. -(void)pushViewController:(NSString *)vcName param:(NSDictionary *)param{
  2.  
  3. //获取类
  4. Class vcClass = NSClassFromString(vcName);
  5. if (vcClass == nil) {
  6. return;
  7. }
  8.  
  9. BaseViewController *vc = [[vcClass alloc] init];
  10. vc.hidesBottomBarWhenPushed = YES;
  11.  
  12. //属性数量
  13. unsigned int count = 0;
  14.  
  15. //获取属性列表
  16. objc_property_t *plist = class_copyPropertyList(vcClass, &count);
  17.  
  18. for (int i = 0; i<count; i++) {
  19.  
  20. //取出属性
  21. objc_property_t property = plist[i];
  22.  
  23. //取出属性名称
  24. NSString *propertyName = [NSString stringWithUTF8String:property_getName(property)];
  25.  
  26. //以这个属性名称作为key ,查看传入的字典里是否有这个属性的value
  27. if (param[propertyName]) {
  28.  
  29. [vc setValue:param[propertyName] forKey:propertyName];
  30. }
  31. }
  32.  
  33. //释放
  34. free(plist);
  35.  
  36. //获取当前页面控制器
  37. /*
  38. 获取当前页面控制器是根据响应链获取的。
  39. */
  40. UIViewController *currentVC = [Utils getCurrentVC];
  41. if ([currentVC isKindOfClass:[UINavigationController class]]) {
  42. [(UINavigationController *)currentVC pushViewController:vc animated:YES];
  43. }else{
  44. [currentVC.navigationController pushViewController:vc animated:YES];
  45. }
  46. }

经过小规模自测发现是可以实现需求的。但是由于实现时间不长,可能会有不足之处,请谨慎参考。

使用runtime 实现weex 跳转原生页面的更多相关文章

  1. datatables跳转自定义页面(后端分页)

    在后端分页的情况下,怎么做到跳转自定义页面? 0x01 难点: 一. 怎么添加自定义代码? 前提:datatables在整个html加载完毕后,进行datatables数据的渲染,并且把右下角的 “上 ...

  2. appium---如何判断原生页面和H5页面

    目前app中存在越来越多的H5页面了,对于一些做app自动化的测试来说,要求也越来越高,自动化不仅仅要支持原生页面,也要可以H5中进行操作自动化,这一篇介绍如何查看页面上是否存在H5页面,这里首先要了 ...

  3. ionic-native-transitions调用原生页面切换实现ionic路由切换

    废话不多说:ionic-native-transitions调用原生页面切换实现ionic路由切换,从而大大提升ionic应用的性能. ionic-native-transitions是一个ionic ...

  4. iOS8跳到系统设置页面

    iOS5.1+之后跳转setting页面的方式都失效了,不过在iOS8苹果有提供了一个键值允许app跳转到setting页面,具体代码如下: NSURL *url = [NSURL URLWithSt ...

  5. js点击button按钮跳转到页面代码

    点击按钮怎么跳转到另外一个页面呢?我们在网站制作中可能是需要的,因为有时我们需要做这样的效果,尤其是将按钮做成一个图片,而点击图片要跳转到新的页面时,怎么做到呢? 这样的效果可以:onclick=&q ...

  6. HTML实现跳转到页面指定位置

    <a href="#page1">跳转到页面1</a> <a href="#page2">跳转到页面2</a> ...

  7. 登录超时,给出提示跳到登录页面(ajax、导入、导出)

    一.一般页面登录超时验证,可以用过滤器filter,如下: package com.lg.filter; import java.io.IOException; import javax.servle ...

  8. StoryBoard页面联线跳转已经页面之间传参数

    1.选中上图黄色.按住Control 把线拖到要要跳转的页面,寻找show. 2.选中联线.在右边Identifier:随便填入一个标示 3.在按钮点击事件加上如下代码 - (IBAction)but ...

  9. 网页调试技巧:抓取马上跳转的页面POST信息或者页面内容

    http://www.qs5.org/Post/625.html 网页调试技巧:抓取马上跳转的页面POST信息或者页面内容 2016/02/02 | 心得分享 | 0 Replies 有时候调试网页或 ...

随机推荐

  1. [Head First Python]4. pickle.dump pickle.load

    sketch.py #--*-- coding:utf-8 --*-- import pickle import nester man = [] other = [] try: data = open ...

  2. js编程风格

    1.缩进层级,建议四个空格. 2.语句结尾使用分号. 3.行的长度不超过80个字符. 4.换行建议加两个缩进,即8个空格. 5.合理的利用空行. 6.命名: 6.1 变量,驼峰式大小写,有小写字母开始 ...

  3. set(二叉搜索树)

    找球号(一) 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 在某一国度里流行着一种游戏.游戏规则为:在一堆球中,每个球上都有一个整数编号i(0<=i<= ...

  4. CodeForces 25E Test KMP

    Description Sometimes it is hard to prepare tests for programming problems. Now Bob is preparing tes ...

  5. C++之------虚函数

    今天又是周日,公司工业区这里九月份每个周日都会停电一天.停电停网,是没法活的.我们直接去老大家. 老大当爸爸了,回家一段时间了.听说孩子出生就不乖,很折腾他爸妈,这小家伙新生命二代.也愿小家伙早日康复 ...

  6. jQuery中$符号冲突问题 (转载)

    Jquery的$命名冲突: 在Jquery中,$是JQuery的别名,所有使用$的地方也都可以使用JQuery来替换,如$('#msg')等同于JQuery('#msg') 的写法.然而,当我们引入多 ...

  7. Dubbo、Zookeeper、SpringMVC的整合使用

    互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...

  8. LeeCode-Two Sum

    Given an array of integers, find two numbers such that they add up to a specific target number. The ...

  9. python使用get在百度搜索并保存第一页搜索结果

    python使用get在百度搜索并保存第一页搜索结果 作者:vpoet mail:vpoet_sir@163.com 注:随意copy,不用在意我的感受 #coding:utf-8 import ur ...

  10. ALSA音频工具amixer,aplay,arecord

    ALSA音频工具编译安装 ========================================================================1.官网http://www. ...