RN可以很好的与原生进行交互,我们首先看看效果吧:
首先我们来看看React Native 怎样调用iOS的代码并且带有简单的参数:
在iOS工程里面我们新建一个类iOSExport,iOSExport将会实现RCTBridgeModule协议。
首先我们要在iOSExport类的实现中添加这句宏定义:RCT_EXPORT_MODULE()
RCT_EXPORT_MODULE()如果你不传入参数,那么你在iOS中导出的模块名就是类名,你也可以插入参数作为自定义模块名。
@implementation iOSExport
//定义导出的模块名
RCT_EXPORT_MODULE()
@end
后面我们就可以实现协议的代理方法了,协议方法的实现需要在RCT_EXPORT_METHOD,这个宏里面。
我们先写一个有两个参数的方法给js调用:
@implementation iOSExport
//定义导出的模块名
RCT_EXPORT_MODULE()
//定义导出的方法名
RCT_EXPORT_METHOD(rnToiOS:(NSString *)name :(NSInteger)age) {
NSString *st = [NSString stringWithFormat:@"name:%@,age:%ld",name,age];
NSLog(@"test:%@",st);
[self alter:st];
}
@end
这样OC端的工作就OK了,下面我们继续看看js端怎么调用:
首先我们要在js文件里面 import NativeModules
然后在我们需要使用的时候获取导出的模块,我们再用模块调用iOS的导出的函数名就可以了,看代码:
//创建一个可以点击的按钮,点击按钮后调用iOS的rnToiOS方法
<TouchableHighlight
style={[styles.highLight,{marginTop:50}]}
underlayColor='#deb887'
activeOpacity={
0.8}
onPress={() => this._nameAndAge()}
>
<Text>简单数据传递</Text>
</TouchableHighlight>
_nameAndAge() { //多参数的传递
var iOSExport = NativeModules.iOSExport //获取到模块
iOSExport.rnToiOS('帝君',200) //直接调用函数
this.setState({
text:'rnToiOS'
})
}
下面我们再看如何在js端调用iOS的含有字典参数和回调函数的方法。iOS提供给js的回调函数是使用block实现的,看下回调函数的说明:
/**
* The type of a block that is capable of sending a response to a bridged
* operation.