使用runtime 實(shí)現(xiàn)weex 跳轉(zhuǎn)原生頁面
一、簡述
最近項(xiàng)目組打算引入weex,并選定了一個(gè)頁面進(jìn)行試水。頁面很簡單,主要是獲取數(shù)據(jù)渲染頁面,并可以跳轉(zhuǎn)到指定的頁面。跟之前使用RN 相比,weex 確實(shí)要簡單很多。從下圖中我們可以看到,weex 頁面需要跳轉(zhuǎn)到原生頁面,并且跳轉(zhuǎn)到哪個(gè)頁面我們可能并不能寫死。也就是說只要原生頁面之前項(xiàng)目中寫過了,那么理論上來說使用weex 可以任意調(diào)用。那么問題來了,我原來的頁面可能只知道名字,我怎么為那個(gè)頁面?zhèn)髦的??比如有個(gè)頁面orderDetailVC ,跳轉(zhuǎn)時(shí)需要傳入orderId,即orderDetailVC.orderId = @"123";
二、思考
可能最直接的想法就是直接原生給weex 提供一個(gè)方法,讓weex 傳入orderId,然后再push。但是如果明天我們需要跳轉(zhuǎn)到另一個(gè)頁面merchantDetailVC呢?它需要的不是orderId了,可能是一個(gè)merchantId,甚至更多參數(shù)。那怎么才能實(shí)現(xiàn)任意跳轉(zhuǎn)呢?我的想法是,項(xiàng)目是我寫的,需要跳轉(zhuǎn)到哪個(gè)類,那么這個(gè)類名我肯定是清楚的,并且這個(gè)類應(yīng)該需要什么參數(shù)我也是清楚的。只不過我可能不知道怎么用weex 把它參數(shù)傳過去而已。如果知道了類名就意味著我知道了這個(gè)類,我能找到這個(gè)類,那么我就知道這個(gè)類有哪些屬性了,這個(gè)類的所有屬性我都能拿到,只不過有些是我需要給它賦值的,有些是不需要處理的。
三、實(shí)現(xiàn)
整體的思路是:原生給weex 提供一個(gè)通用的跳轉(zhuǎn)方法。參數(shù)是類名和屬性字典。
//控制器相關(guān) /* vcName: 頁面名稱 param:頁面所需參數(shù)(如原來的頁面需要傳遞小區(qū)id,工單號等等,字典形式傳過去,key 與頁面所需參數(shù)名稱一致即可。 */ -(void)pushViewController:(NSString *)vcName param:(NSDictionary *)param; /* 將APP 當(dāng)前展示的頁面pop */ -(void)popViewController; /* vcName: 頁面名稱 param:頁面所需參數(shù)(如原來的頁面需要傳遞小區(qū)id,工單號等等,字典形式傳過去,key 與頁面所需參數(shù)名稱一致即可。 */ -(void)presentViewController:(NSString *)vcName param:(NSDictionary *)param finish:(WXModuleCallback)callback; /* 將APP 當(dāng)前展示的頁面dismiss */ -(void)dismissViewController:(WXModuleCallback)callback;
提供方法后weex 可以這樣調(diào)用:
確定了方案之后,剩下唯一的事情就是如何實(shí)現(xiàn)給weex 提供的方法。代碼如下:
-(void)pushViewController:(NSString *)vcName param:(NSDictionary *)param{ //獲取類 Class vcClass = NSClassFromString(vcName); if (vcClass == nil) { return; } BaseViewController *vc = [[vcClass alloc] init]; vc.hidesBottomBarWhenPushed = YES; //屬性數(shù)量 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)]; //以這個(gè)屬性名稱作為key ,查看傳入的字典里是否有這個(gè)屬性的value if (param[propertyName]) { [vc setValue:param[propertyName] forKey:propertyName]; } } //釋放 free(plist); //獲取當(dāng)前頁面控制器 /* 獲取當(dāng)前頁面控制器是根據(jù)響應(yīng)鏈獲取的。 */ UIViewController *currentVC = [Utils getCurrentVC]; if ([currentVC isKindOfClass:[UINavigationController class]]) { [(UINavigationController *)currentVC pushViewController:vc animated:YES]; }else{ [currentVC.navigationController pushViewController:vc animated:YES]; } }
經(jīng)過小規(guī)模自測發(fā)現(xiàn)是可以實(shí)現(xiàn)需求的。但是由于實(shí)現(xiàn)時(shí)間不長,可能會有不足之處,請謹(jǐn)慎參考。如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Android簡單實(shí)現(xiàn)動態(tài)權(quán)限獲取相機(jī)權(quán)限及存儲空間等多權(quán)限
這篇文章主要介紹了Android簡單實(shí)現(xiàn)動態(tài)權(quán)限獲取相機(jī)權(quán)限及存儲空間等多權(quán)限,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-07-07Android動態(tài)更新Menu菜單的實(shí)現(xiàn)過程
菜單是用戶界面中最常見的元素之一,使用非常頻繁,下面這篇文章主要給大家介紹了關(guān)于Android動態(tài)更新Menu菜單的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09Android仿QQ分組實(shí)現(xiàn)二級菜單展示
這篇文章主要為大家詳細(xì)介紹了Android仿QQ分組實(shí)現(xiàn)二級菜單展示,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09Android監(jiān)控和阻斷InputDispatching ANR的方法
如何在Java層實(shí)現(xiàn)異步監(jiān)控和阻斷InputDispatching ANR?我相信這是很多開發(fā)者都想要的功能,本篇,我們會通過“探索”兩種方案來實(shí)現(xiàn)在Java層監(jiān)控&阻斷的方法,需要的朋友可以參考下2024-04-04android實(shí)現(xiàn)圖片驗(yàn)證碼方法解析(自繪控件)
本文主要介紹了android自繪控件的應(yīng)用--實(shí)現(xiàn)圖片驗(yàn)證碼方法案例,具有一定的參考價(jià)值,下面跟著小編一起來看下吧2017-01-01Android 出現(xiàn)的警告(Service Intent must be explicit)解決辦法詳解
這篇文章主要介紹了Android 出現(xiàn)的警告(Service Intent must be explicit)解決辦法詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04Android仿微信底部菜單欄功能顯示未讀消息數(shù)量
這篇文章主要介紹了Android仿微信底部菜單欄功能,并顯示未讀消息數(shù)量,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05Android 中對JSON數(shù)據(jù)解析實(shí)例代碼
這篇文章主要介紹了Android 中對JSON數(shù)據(jù)解析實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-03-03