React Native Swift 模块中的回调函数

Posted

技术标签:

【中文标题】React Native Swift 模块中的回调函数【英文标题】:Callback Functions in React Native Swift Modules 【发布时间】:2017-08-28 02:25:28 【问题描述】:

我正在尝试使用可以在我的 javascript 代码中调用的函数创建一个本机 swift 模块。目前我有我的module.swift 文件、我的module.m 文件和桥接头。

这是 MyModule.swift:

import Foundation

@objc(MyModule)
class MyModule: NSObject 

  @objc func callbackMethod(callback: RCTResponseSenderBlock) -> Void 
     let resultsDict = [
     "success" : true
     ];

    callback([NSNull() ,resultsDict])
  


这是 MyModule.m:

#import <Foundation/Foundation.h>

// CalendarManagerBridge.m
#import <React/RCTBridgeModule.h>
#import <React/RCTEventEmitter.h>

@interface RCT_EXTERN_MODULE(MyModule, NSObject)

RCT_EXTERN_METHOD(callbackMethod:(RCTResponseSenderBlock)callback)

@end

这是桥接头:

#import React/RCTBridgeModule.h

#import React/RCTEventEmitter.h

最后,这是我在 javascript 中的调用:

const  MyModule  = require('NativeModules');
MyModule.callbackMethod((err,r) => console.log(r));

问题是每次我运行项目都会报错:

Exception 'callbackMethod:(RCTResponseSenderBlock)callback is not a recognized Objective-c
 method.' 

但是,我找不到文档有任何问题。有人可以提供一些帮助吗?

【问题讨论】:

您正在使用需要两个参数的保持活动回调在这里您将字典作为接受的第二个参数传递但 nsnull 作为第一个为什么?我认为第一个参数是此类回调中的布尔值,尝试传递 true 而不是 nsnull,第二个 RCTResponseSenderBlock 是您提供的块或回调名称类型。如果它是一个块,它是在模块中注册的吗? 【参考方案1】:

由于某种原因,我们现在需要为方法编写不同的@objc 部分。

改变

@objc func callbackMethod(callback: RCTResponseSenderBlock) -> Void 
 let resultsDict = [
 "success" : true
 ];

callback([NSNull() ,resultsDict])

@objc(callbackMethod:)
func callbackMethod(callback: RCTResponseSenderBlock) -> Void 
 let resultsDict = [
 "success" : true
 ];

callback([NSNull() ,resultsDict])

【讨论】:

以上是关于React Native Swift 模块中的回调函数的主要内容,如果未能解决你的问题,请参考以下文章

在 React Native 模块中将 Swift 类导入 Obj-C

如何在 swift iOS 中使用非 UI react-native 模块

错误回调不适用于 React Native 中的地理位置

React-Native 的 Native 端能否向 React 请求信息? (桥接/本机模块)

纯在 Swift 中的 React Native 应用程序

如何在 React Native 中的 firebase 服务函数成功后运行回调函数