React Native Swift 回调函数

9

我想从React Native向一个使用Swift实现的模块发送一个字符串,并在接收到原生模块的回调后获得一个字符串结果,以供进一步使用。

以下是我的代码:

//HelloWorldModule.m

#import "RCTBridgeModule.h"

@interface RCT_EXTERN_MODULE(HelloWorldModule, NSObject)

RCT_EXTERN_METHOD(sayHelloWorld:(NSString *)name callback:(RCTResponseSenderBlock *)successCallback)

@end

除了 Swift 实现之外:

//  HelloWorldModule.swift

import Foundation
import UIKit
import AVFoundation

@objc(HelloWorldModule)
class HelloWorldModule: NSObject {

  @objc func sayHelloWorld(name: String,  callback successCallback: RCTResponseSenderBlock) {
    NSLog("Log from Swift: \(name)")
    successCallback([name])
  }
}

最后是进入ReactNative部分的任何内容:

// requiring the Swift module in React Native
var HelloWorldModule = require('react-native').NativeModules.HelloWorldModule;

...

// using it somewhere in the render function

render: function() {
       return (
        <Text>
          Hello World Module answers: {this.hwmExt("Jadzia Dax")}
        </Text>
       );
},

hwmExt: function(name) {
    return HelloWorldModule.sayHelloWorld(name, function(result) {
       var hwAnswer = "swiftCB: " + result;
       console.log(hwAnswer);
       return hwAnswer;
    });
}

这行代码 console.log(hwAnswer); 打印出了我期望的结果swiftCB: Jadzia Dax,但是结果没有被传递过去?在Swift方法定义方面是否有什么问题,因为我总是得到未定义的结果?不知何故,我一直被这个问题困扰着 :/ 遗憾的是React Native Swift模块回调在RN文档中没有涉及。

1个回答

13

RCTResponseSenderBlock回调函数遵循Node.js的错误优先风格,即第一个回调参数保存错误,第二个参数保存结果

在你的示例中,你返回了一个错误值,而没有返回结果值,因此是undefined。你应该返回NSNull作为错误(第一个)参数,并返回name作为第二个参数,例如[NSNUll(), name]

这篇简短的博客文章展示了如何使用Swift和React Native来实现这一点。在博客文章中,查看MySwiftThingy.swift中的第11行。


太棒了,这篇文章简短而精彩! - Ulises Giacoman
@cmd 请看一下我的问题:https://stackoverflow.com/questions/53620105/dismiss-a-view-controller-from-react-native 我正在尝试从一个Objective-C模块中关闭一个React组件。 - nr5
唯一更新博客的是,您必须添加下划线,例如simpleMethod(_ message: String)。 - George Salamanca
1
我他妈的,试了两天才用successCallback和errCallback让它正常工作。非常感谢你。 - rotoxl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接