我想从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文档中也没有涉及。
答案 0 :(得分:8)
RCTResponseSenderBlock
回调遵循Node.js 错误第一个样式,即第一个回调参数保存错误,第二个参数保存结果
在您的示例中,您将返回错误的值,而没有值结果,因此undefined
。您应该返回NSNull
作为错误(第一个)参数,并将name
作为第二个参数返回,例如[NSNUll(), name]
。
This short blog post显示了如何使用Swift和React Native完成此操作。在blog帖子中,请参阅MySwiftThingy.swift
中的 11 行。