使用runtime 實現weex 跳轉原生頁面

来源:http://www.cnblogs.com/dengzhuli/archive/2017/01/10/6270681.html
-Advertisement-
Play Games

一、簡述 最近項目組打算引入weex,並選定了一個頁面進行試水。頁面很簡單,主要是獲取數據渲染頁面,並可以跳轉到指定的頁面。跟之前使用RN 相比,weex 確實要簡單很多。從下圖中我們可以看到,weex 頁面需要跳轉到原生頁面,並且跳轉到哪個頁面我們可能並不能寫死。也就是說只要原生頁面之前項目中寫過 ...


一、簡述

  最近項目組打算引入weex,並選定了一個頁面進行試水。頁面很簡單,主要是獲取數據渲染頁面,並可以跳轉到指定的頁面。跟之前使用RN 相比,weex 確實要簡單很多。從下圖中我們可以看到,weex 頁面需要跳轉到原生頁面,並且跳轉到哪個頁面我們可能並不能寫死。也就是說只要原生頁面之前項目中寫過了,那麼理論上來說使用weex 可以任意調用。那麼問題來了,我原來的頁面可能只知道名字,我怎麼為那個頁面傳值呢?比如有個頁面orderDetailVC  ,跳轉時需要傳入orderId,即orderDetailVC.orderId = @"123"; 

二、思考

  可能最直接的想法就是直接原生給weex 提供一個方法,讓weex 傳入orderId,然後再push。但是如果明天我們需要跳轉到另一個頁面merchantDetailVC呢?它需要的不是orderId了,可能是一個merchantId,甚至更多參數。那怎麼才能實現任意跳轉呢?我的想法是,項目是我寫的,需要跳轉到哪個類,那麼這個類名我肯定是清楚的,並且這個類應該需要什麼參數我也是清楚的。只不過我可能不知道怎麼用weex 把它參數傳過去而已。如果知道了類名就意味著我知道了這個類,我能找到這個類,那麼我就知道這個類有哪些屬性了,這個類的所有屬性我都能拿到,只不過有些是我需要給它賦值的,有些是不需要處理的。

三、實現

  整體的思路是:原生給weex 提供一個通用的跳轉方法。參數是類名和屬性字典。

//控制器相關
/*
 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 提供的方法。代碼如下:

-(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];
    }
}

 經過小規模自測發現是可以實現需求的。但是由於實現時間不長,可能會有不足之處,請謹慎參考。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [1]語法 [2]灰度 [3]飽和度 [4]褐色 [5]色相 [6]反色 [7]透明度 [8]亮度 [9]對比度 [10]模糊 [11]陰影 ...
  • 新人,小白一枚,剛剛參加工作,所以會在這裡記錄一些遇到的問題。 最近要做的東西,是對一個表格動態的添加行,刪除行,並且對錶格中內容進行非空驗證。 ...
  • 本文對Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法進行了詳細的總結,需要的朋友可以參考下,希望對大家有所幫助。 詳細解讀Jquery各Ajax函數: $.get(),$.post(),$.ajax(),$.getJSON() 一,$.get(url, ...
  • http://www.cssauthor.com/best-responsive-admin-templates/#Free ...
  • JavaScript課程 兩日大綱 ● JavaScript基本語法 ● JavaScript函數 ● JavaScript基於對象編程 ● JavaScript BOM對象編程 ● JavaScript DOM對象編程 ● JavaScript JSON格式簡介 *****************... ...
  • 一、官方文檔的說明 in the face of "evil features" such as eval or with, the YUI Compressor takes a defensive approach by not obfuscating any of the scopes cont ...
  • 之前的博文中有介紹關於圖片輪播的實現方式,分別為(含超鏈接): 1、《Android中使用ViewFlipper實現屏幕切換》 2、《Android中使用ViewPager實現屏幕頁面切換和頁面輪播效果》 3、《Android中使用ImageViewSwitcher實現圖片切換輪播導航效果》 今天通 ...
  • 輪播圖是很常用的一個效果 核心功能已經實現 沒有什麼特殊需求 自己沒事研究的 所以封裝的不太好 一些地方還比較糙 為想要研究輪播圖的同學提供個參考 目前測試圖片為mipmap中的圖片 沒有寫從網路載入圖片 可自行根據需求在getShowView()方法中修改 1.定時切換 通過handle延時發送通 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...