RN跳转iOS原生页面

RN调用原生方法,在原生方法中发送本地通知,接收到通知跳转页面,要注意的是RN调用原生方法,会自动开启一个新的线程,并非在主线程,如果直接发送通知,那么push控制器的时候就会有很大的延时,为了保证正常跳转,通知应该在主线程发送

1、遵守RCTBridgeModule协议

2、实现协议方法RCT_EXPORT_MODULE(导出模块的模块名)

这里的即是协议方法的实现,也是OC模块的导出
虽然这里的模块名只是为了暴露给RN,但是还是需要给出有一定意义的名字方便区别,通常建议采用,导出OC模块的类名

3、导出供RN调用的方法

使用宏 RCT_EXPORT_METHOD将要导出的方法包裹即可

//OC方法
- (void)Test
{
}
//导出写成
RCT_EXPORT_METHOD(Test)
{

}

//OC方法带参数
- (void)TestWithParams:(NSDictionary *)params
{

}
//导出写成
RCT_EXPORT_METHOD(TestWithParams:(NSDictionary *)params)
{

}

//OC方法带参数和RN回调
- (void)TestWithParams:(NSDictionary *)params RNCallBack:(RCTResponseSenderBlock)RNCallBack)
{

}
//导出写成
RCT_EXPORT_METHOD(TestWithParams:(NSDictionary *)params RNCallBack:(RCTResponseSenderBlock)RNCallBack)
{
    NSLog(@"参数:%@",params);
    NSArray *events = [[NSArray alloc] initWithObjects:@"张三", @"张三",nil];
    if (RNCallBack)
    {
        RNCallBack(@[[NSNull null], events]);
    }
}

RCTResponseSenderBlock
的声明是
typedef void (^RCTResponseSenderBlock)(NSArray *response);
参数是一个数组,回调时当作参数传给RN,RN接收到后将数组的每一个元素都单独当作一个参数处理。也就是说如果RCTResponseSenderBlock参数传入@[参数1,参数2,...,参数n],如果在RN端接收,形参列表应该是(形参1,形参2,...,形参n)。通常情况下传入两个参数参数1(错误信息,没有错误就是[NSNull null])参数2(其他信息json结构OC字典即可)

4、在RN中调用导出的OC方法

1)导入NativeModules
var { NativeModules } = require('react-native');
2)调用OC方法
格式:
第二步导出OC模块的名.导出方法名(形参列表)

onPress={(error,events) => test1(error,events)}

function test1(error,events){
    NativeModules.导出OC模块的名.TestWithParams(
{name:'张超',age:'30',books:[{name:'java',price:'100'},{name:'java',price:'100'}]},
(error,events) => {console.log(events)});}

你可能感兴趣的:(RN跳转iOS原生页面)