你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 運用runtime 完成weex 跳轉原生頁面

運用runtime 完成weex 跳轉原生頁面

編輯:IOS開發綜合

此文描繪了運用runtime 完成weex 跳轉原生頁面的相關引見,詳細實例請看下文

一、簡述

  最近項目組計劃引入weex,並選定了一個頁面停止試水。頁面很復雜,次要是獲取數據渲染頁面,並可以跳轉到指定的頁面。跟之前運用RN 相比,weex 的確要復雜很多。從下圖中我們可以看到,weex 頁面需求跳轉到原生頁面,並且跳轉到哪個頁面我們能夠並不能寫死。也就是說只需原生頁面之前項目中寫過了,那麼實際下去說運用weex 可以恣意調用。那麼問題來了,我原來的頁面能夠只知道名字,我怎樣為那個頁面傳值呢?比方有個頁面orderDetailVC ,跳轉時需求傳入orderId,即orderDetailVC.orderId = @"123";

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

二、考慮

  能夠最直接的想法就是直接原生給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 可以這樣調用:

使用runtime 實現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];
    }
}

經過小規模自測發現是可以完成需求的。但是由於完成時間不長,能夠會有缺乏之處,請慎重參考。

以上就是這篇文章的全部內容了,希望大家可以喜歡。

【運用runtime 完成weex 跳轉原生頁面】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved