React Native Swift回调

时间:2016-01-06 05:11:44

标签: javascript swift callback react-native

我想从React Native向Swift实现的模块发送一个String,然后从本机模块获取一个String结果作为回调以供进一步使用。

这是我得到的:

//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 个答案:

答案 0 :(得分:8)

RCTResponseSenderBlock回调遵循Node.js 错误第一个样式,即第一个回调参数保存错误,第二个参数保存结果

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

This short blog post显示了如何使用Swift和React Native完成此操作。在blog帖子中,请参阅MySwiftThingy.swift中的 11 行。