无法从React Native项目中调用ios本机模块

时间:2018-07-06 10:59:23

标签: react-native react-native-ios native-module react-native-native-module

你好朋友,我想让我的插件成为react native,我想从我的react native js文件中调用ios native模块功能,所以下面是我的代码

ios库代码如下

@implementation RNMyLib

- (dispatch_queue_t)methodQueue{
   return dispatch_get_main_queue();
 }
RCT_EXPORT_MODULE()


 RCT_EXPORT_METHOD(findEvents:(RCTResponseSenderBlock)callback)
 {
    NSString * strName = @"findEvents";

   callback(strName);
}

JS文件代码如下

 import { NativeModules } from 'react-native';

 var MyLibManager = NativeModules.RNMyLib;

 MyLibManager.findEvents((strName) => {
    console.log("GET FUN CODE >>>>> "+ strName);
 });

我只想将我的js文件中的简单函数调用到ios本机库类,但是当我在上述代码上运行时,出现类似 TypeError:undefined不是对象(评估'MyLibManager.findEvents')的错误

你知道我该怎么解决吗?您的所有建议均适用

1 个答案:

答案 0 :(得分:0)

因此,在您的本机代码中,您实际上必须将NSArray传递回callback。这样的。

RCT_EXPORT_METHOD(findEvents:(RCTResponseSenderBlock)callback)
{
  NSArray *events = ...
  callback(@[[NSNull null], events]);
}

NSArray中的第一个元素是您传递错误的机会。对于您而言,它总是可以解析,因此只需将其保留为[NSNull null]。在示例中,第二个参数代替events将是您的strName

从JS端开始,回调实际上是传统的node回调,它以错误作为第一个参数,而实际项则由第二个参数解析。因此,

MyLibManager.findEvents((_, strName) => {
    console.log("GET FUN CODE >>>>> "+ strName);
})

如果您更喜欢Promise模式,可以使用以下内容:

RCT_REMAP_METHOD(findEvents,
                 findEventsWithResolver:(RCTPromiseResolveBlock)resolve
                 _:(RCTPromiseRejectBlock)reject) // I like to leave this as _ if it never fails
{
  NSString *strName = @"findEvents";
  resolve(strName);
}

还有JS。

const strName = await MyLibManager.findEvents;