一、無回調(diào)通信
1.第一步 在iOS工程里面創(chuàng)建一個對象RNToNativeManager 并遵循RCTBridgeModule協(xié)議(需要引入#import <React/RCTBridgeModule.h> #import <React/RCTLog.h>頭文件)
#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
#import <React/RCTLog.h>
@interface RNToNativeManaer : NSObject<RCTBridgeModule>
@end
第二步 在.m文件需要包含RCT_EXPORT_MODULE()宏,而且要在RCT_EXPORT_METHOD這個宏里面跑出來供javaScript調(diào)用的方法()(注意如果要在這個方法里面操作view要回到主線程)
#import "RNToNativeManaer.h"
@implementation RNToNativeManaer
RCT_EXPORT_MODULE();
RCT_EXPORT_METHOD(addEvent:(NSString *)name location:(NSString *)location){
RCTLogInfo(@"creat an event%@ at %@",name,location);
[[NSNotificationCenter defaultCenter]postNotificationName:@"push" object:self];
}
@end
第三步 在js端調(diào)用native跑出來的這個方法(這里要引入NativeModules)
var RNToNativeManaer = NativeModules.RNToNativeManaer;
class App extends Component{
// 構(gòu)造
constructor(props) {
super(props);
// 初始狀態(tài)
this.state = {
w:100,
h:100,
};
this.handlePress=this.handlePress.bind(this);
}
handlePress(){
RNToNativeManaer.addEvent(' Party','street');
}
render(){
return(
<View style={styles.container}>
<TouchableOpacity onPress={this.handlePress}><Text >123</Text></TouchableOpacity>
</View>
);
}
}
在這里要注意: Javascript方法名
導出到Javascript的方法名是Objective-C的方法名的第一個部分铅搓。React Native還定義了一個RCT_REMAP_METHOD()宏哭当,它可以指定Javascript方法名迹辐。當許多方法的第一部分相同的時候用它來避免在Javascript端的名字沖突呵萨。且橋接到Javascript的方法返回值類型必須是void撒犀。
二某宪、回調(diào)函數(shù)通信
回調(diào)函數(shù)RCTResponseSenderBlock,它可以把返回值傳給javaScript.
native跑出來的方法如下
RCT_EXPORT_METHOD(findEvents:(RCTResponseSenderBlock)callBack){
NSArray *array =@[@"1",@"2"];
callBack(@[[NSNull null],array]);
}
reactNative端代碼
把上面的handlePress函數(shù)內(nèi)容替換如下就可以了
handlePress(){
// RNToNativeManaer.addEvent(' Party','street');
RNToNativeManaer.findEvents((error,events)=>{
if (error){
console.log(error);
}else {
console.log(events);
this.setState({
event:events,
});
}
});
}