【问题标题】:React Native Swift callback反应原生 Swift 回调
【发布时间】:2016-04-10 03:00:42
【问题描述】:

我想从 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 中的方法定义中做错了什么,因为我总是未定义?不知何故对这个问题视而不见:/ 不幸的是,RN 文档中也没有涵盖 React Native Swift 模块回调。

【问题讨论】:

    标签: javascript swift callback react-native


    【解决方案1】:

    RCTResponseSenderBlock 回调遵循 Node.js error first style,即第一个回调参数包含 error,第二个参数包含 result

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

    This short blog post 准确展示了如何使用 Swift 和 React Native 做到这一点。在blog 帖子中,请参阅MySwiftThingy.swift 中的第 11 行。

    【讨论】:

    • 伟大的发现,简短而甜蜜的文章!
    • @cmd 请看一下我的问题:stackoverflow.com/questions/53620105/… 我正在尝试关闭从 Objective-C 模块呈现的反应组件。
    • 对博客的唯一更新是您必须添加下划线,例如 simpleMethod(_ message: String)
    • 该死的,两天时间试图让它与 successCallback 和 errCallback 一起工作。非常感谢
    猜你喜欢
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 2017-10-25
    相关资源
    最近更新 更多