国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

ios原生和react-native各種交互的示例代碼

2019-10-21 18:45:00
字體:
來源:轉載
供稿:網(wǎng)友

需求:讓一個表格視圖中的cell能左滑刪除,效果圖如下:

react,native,ios交互,ios,reactnative,原生交互

目前RN中的ListView主要問題是復用,以及其他一些細節(jié)如索引視圖、左滑刪除、編輯等,要想在RN上自定義實現(xiàn)原生的這種效果尚有一定的問題,在必要時可以考慮使用原生的UITableView,數(shù)據(jù)從RN端傳遞

1、原生端編寫表格控制器NativeTableViewController,暴露的屬性如下

react,native,ios交互,ios,reactnative,原生交互

datas為表格數(shù)據(jù)源,另外一個為需要暴露給RN調(diào)用用方法。

2、框架只提供了暴露UIView給RN端的接口,所以需要制作一個中轉UIView視圖,該UIView的.h文件跟控制器的完全一致,.m實現(xiàn)如下

react,native,ios交互,ios,reactnative,原生交互

視圖初始化的時候創(chuàng)建控制器,并將控制器的view添加為子視圖,顯示的時候就是控制器的視圖了。setDatas和changeBackgroundColor方法僅僅只是個鏈接作用,實際是調(diào)用的控制器的方法

3、要想將UIView視圖暴露給RN,需要使用RCTViewManager的子類。RCTViewManager為框架提供的原生端視圖管理類,已經(jīng)實現(xiàn)了RCTBridgeModule接口,會自動將相應的UIView注冊到橋接文件中。子類需要實現(xiàn)兩個方法

react,native,ios交互,ios,reactnative,原生交互
.h文件

react,native,ios交互,ios,reactnative,原生交互
.m文件

react,native,ios交互,ios,reactnative,原生交互
.m文件

宏RCT_EXPORT_VIEW_PROPERTY是將該管理類管理的那個視圖,也就是方法-(UIView *)view返回的那個視圖的屬性暴露出去,js端設置該屬性的時候會觸發(fā)屬性的setter方法,也就是NativeTableView中實現(xiàn)的- (void)setDatas:(NSArray *)datas,進而觸發(fā)控制器的setDatas方法,刷新表格

4、js端調(diào)用。如下封裝原生端暴露出去的視圖,需要注意的是默認情況下,requireNativeComponent方法的第一個參數(shù)不是原生端的類名

react,native,ios交互,ios,reactnative,原生交互

使用如下,必須要設置寬高才行

react,native,ios交互,ios,reactnative,原生交互

5、現(xiàn)在已經(jīng)完成了視圖的顯示,還缺少的是事件回調(diào)。這里有兩類事件,觸發(fā)條件不一:

a、js端事件驅動,舉例:js端調(diào)用原生表格控制器的changeBackgroundColor方法

b、原生端事件驅動,舉例:原生cell左滑,點擊刪除按鈕,觸發(fā)js端數(shù)據(jù)源數(shù)據(jù)改變,進而刷新頁面

a事件方案:

RCT_EXPORT_METHOD宏可以將原生端方法暴露給js端,js直接調(diào)用就可以了。那么在這個方法里面要如何才能拿到目標視圖NativeTableView,然后調(diào)用它的changeBackgroundColor方法呢?

很顯然的看到了我們重寫的父類方法- (UIView *)view,這里可以得到NativeTableView,但是每次調(diào)用都是返回一個新的視圖,那么可以將這個視圖緩沖起來,然后每次都返回同一個?理想很豐滿,現(xiàn)實很骨感,看官方的文檔

react,native,ios交互,ios,reactnative,原生交互

顯然這里不允許換成該視圖。至于原因我也不太清楚

看源碼發(fā)現(xiàn)每個注冊的視圖其實都是有編號tag的,只要知道原生端視圖注冊時生成的tag,就能從視圖管理類RCTUIManager中找到它,下面是最終實現(xiàn)代碼

react,native,ios交互,ios,reactnative,原生交互

js端調(diào)用如下:

react,native,ios交互,ios,reactnative,原生交互

findNodeHandle方法直接從react-native庫中導出,找到視圖的tag

react,native,ios交互,ios,reactnative,原生交互

b事件方案:

原生端事件通知js端,使用RCTEventEmitter。

react,native,ios交互,ios,reactnative,原生交互

react,native,ios交互,ios,reactnative,原生交互

原生事件觸發(fā)時調(diào)用如下:

react,native,ios交互,ios,reactnative,原生交互

控制器NativeTableViewController的代理方法實現(xiàn)

js端監(jiān)聽原生調(diào)用事件如下:

react,native,ios交互,ios,reactnative,原生交互

react,native,ios交互,ios,reactnative,原生交互

流程是:

1、js端注冊監(jiān)聽原生端通知

2、原生端表格代理方法觸發(fā)事件,調(diào)用RativeTOJSEventEmitter發(fā)出通知

3、js端監(jiān)聽到通知,觸發(fā)回調(diào),處理數(shù)據(jù),重新刷新視圖

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關教程知識閱讀請移步到IOS開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 威信县| 介休市| 沾益县| 龙门县| 屏山县| 额尔古纳市| 大渡口区| 宁河县| 龙口市| 泌阳县| 扎囊县| 共和县| 江安县| 高密市| 土默特左旗| 遂川县| 唐海县| 高青县| 峨眉山市| 广丰县| 江华| 浮山县| 雷波县| 山阳县| 北海市| 澄江县| 古丈县| 红原县| 通州区| 唐海县| 彭山县| 蒲江县| 永清县| 潜山县| 和静县| 若尔盖县| 石嘴山市| 荔浦县| 福安市| 浠水县| 兖州市|