我想从 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 模块回调。
最佳答案
RCTResponseSenderBlock
回调遵循 Node.js 错误优先风格,即第一个回调参数包含错误,第二个参数包含结果.
在您的示例中,您为错误 返回了一个值,而没有为结果 返回值,因此未定义
。您应该返回 NSNull
作为错误(第一个)参数,而 name
作为第二个参数,例如[NSNUll(), 名称]
。
This short blog post展示了如何使用 Swift 和 React Native 来做到这一点。在blog发布,请参阅 MySwiftThingy.swift
中的 11 行。
关于javascript - react native Swift 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34626046/