方法不是公认的 objective c 方法
method is not a recognised objective c method
关于相同的问题有很多问题,但 none 解决了我的错误。
这是我的 objective c 文件
#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
#import <UIKit/UIKit.h>
@interface RCT_EXTERN_MODULE(LanguageTranslationModule, NSObject)
RCT_EXTERN_METHOD(callbackMethod:(NSString*)englishText (RCTResponseSenderBlock)callback)
@end
这是我的swiftclass
@objc(LanguageTranslationModule)
class LanguageTranslationModule: NSObject {
var resultCallback: RCTResponseSenderBlock!
@objc func callbackMethod(_ englishText: String, callback: @escaping RCTResponseSenderBlock) -> Void {
resultCallback = callback
debugPrint("Hi there")
translateText(msg: englishText)
}...
这是我从 React Native 调用的 JS
LanguageTranslationModule.callbackMethod(englishText, (err, r) => {
if (!err) {
setProgress(false);
setMarathiText(r.text.toString());
} else {
setProgress(false);
setMarathiText(err);
}
});
以下是我的翻译文字方法
func translateText(msg: String) {
let options = TranslatorOptions(sourceLanguage: .en, targetLanguage: .mr)
let englishMarathiTranslator = NaturalLanguage.naturalLanguage().translator(options: options)
let conditions = ModelDownloadConditions(
allowsCellularAccess: false,
allowsBackgroundDownloading: true
)
englishMarathiTranslator.downloadModelIfNeeded(with: conditions) {error in
guard error == nil else { return }
englishMarathiTranslator.translate(msg) { (translatedText, error) in
guard error == nil, let translatedText = translatedText else { return }
let resultsDict = [
"text" : translatedText
];
self.resultCallback([NSNull() ,resultsDict])
}
}
}
在 swift 文件中的第一个参数中添加了下划线,因为这是对堆栈上提出的其他问题的大部分解决方案,并且在下划线和实际变量名称之间有 space。如果我从所有文件中删除 englishText 变量并在 swift 文件中对该文本进行硬编码,那么我的函数就可以正常工作。当然,我不得不在回调变量中添加下划线,所以我这边没有逻辑错误
我假设错误在问题的标题中。您的 Swift 方法的签名似乎与 Objective C 接口中声明的签名不匹配。
尝试向声明中的第二个参数添加参数标签。
#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
#import <UIKit/UIKit.h>
@interface RCT_EXTERN_MODULE(LanguageTranslationModule, NSObject)
RCT_EXTERN_METHOD(callbackMethod:(NSString*)englishText callback:(RCTResponseSenderBlock)callback)
// ^^^^^^^^
@end
解释:
RCT_EXTERN_METHOD(callbackMethod:(NSString*)englishText callback:(RCTResponseSenderBlock)callback)
匹配
@objc func callbackMethod(_ englishText: String, callback: @escaping RCTResponseSenderBlock) -> Void
而您的原始变体
RCT_EXTERN_METHOD(callbackMethod:(NSString*)englishText (RCTResponseSenderBlock)callback)
将匹配
@objc func callbackMethod(_ englishText: String, _ callback: @escaping RCTResponseSenderBlock) -> Void
关于相同的问题有很多问题,但 none 解决了我的错误。
这是我的 objective c 文件
#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
#import <UIKit/UIKit.h>
@interface RCT_EXTERN_MODULE(LanguageTranslationModule, NSObject)
RCT_EXTERN_METHOD(callbackMethod:(NSString*)englishText (RCTResponseSenderBlock)callback)
@end
这是我的swiftclass
@objc(LanguageTranslationModule)
class LanguageTranslationModule: NSObject {
var resultCallback: RCTResponseSenderBlock!
@objc func callbackMethod(_ englishText: String, callback: @escaping RCTResponseSenderBlock) -> Void {
resultCallback = callback
debugPrint("Hi there")
translateText(msg: englishText)
}...
这是我从 React Native 调用的 JS
LanguageTranslationModule.callbackMethod(englishText, (err, r) => {
if (!err) {
setProgress(false);
setMarathiText(r.text.toString());
} else {
setProgress(false);
setMarathiText(err);
}
});
以下是我的翻译文字方法
func translateText(msg: String) {
let options = TranslatorOptions(sourceLanguage: .en, targetLanguage: .mr)
let englishMarathiTranslator = NaturalLanguage.naturalLanguage().translator(options: options)
let conditions = ModelDownloadConditions(
allowsCellularAccess: false,
allowsBackgroundDownloading: true
)
englishMarathiTranslator.downloadModelIfNeeded(with: conditions) {error in
guard error == nil else { return }
englishMarathiTranslator.translate(msg) { (translatedText, error) in
guard error == nil, let translatedText = translatedText else { return }
let resultsDict = [
"text" : translatedText
];
self.resultCallback([NSNull() ,resultsDict])
}
}
}
在 swift 文件中的第一个参数中添加了下划线,因为这是对堆栈上提出的其他问题的大部分解决方案,并且在下划线和实际变量名称之间有 space。如果我从所有文件中删除 englishText 变量并在 swift 文件中对该文本进行硬编码,那么我的函数就可以正常工作。当然,我不得不在回调变量中添加下划线,所以我这边没有逻辑错误
我假设错误在问题的标题中。您的 Swift 方法的签名似乎与 Objective C 接口中声明的签名不匹配。
尝试向声明中的第二个参数添加参数标签。
#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
#import <UIKit/UIKit.h>
@interface RCT_EXTERN_MODULE(LanguageTranslationModule, NSObject)
RCT_EXTERN_METHOD(callbackMethod:(NSString*)englishText callback:(RCTResponseSenderBlock)callback)
// ^^^^^^^^
@end
解释:
RCT_EXTERN_METHOD(callbackMethod:(NSString*)englishText callback:(RCTResponseSenderBlock)callback)
匹配
@objc func callbackMethod(_ englishText: String, callback: @escaping RCTResponseSenderBlock) -> Void
而您的原始变体
RCT_EXTERN_METHOD(callbackMethod:(NSString*)englishText (RCTResponseSenderBlock)callback)
将匹配
@objc func callbackMethod(_ englishText: String, _ callback: @escaping RCTResponseSenderBlock) -> Void