方法不是公认的客观 c 方法

Posted

技术标签:

【中文标题】方法不是公认的客观 c 方法【英文标题】:method is not a recognised objective c method 【发布时间】:2020-04-25 15:10:49 【问题描述】:

问了很多同样的问题,但没有一个能解决我的错误。

这是我的目标 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

这是我的快速课程

@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 文件中的第一个参数中添加了下划线,因为这是解决堆栈上其他问题的大部分解决方案,并且下划线和实际变量名之间有空格。如果我从所有文件中删除 englishText 变量并将该文本硬编码到 swift 文件中,那么我的函数可以正常工作。当然,我必须在回调变量中添加下划线,所以我这边没有逻辑错误

【问题讨论】:

你不需要在你的 swift 方法中调用回调吗?如果你不调用,你的 js 方法永远不会触发。 @ibrahimyilmaz 我给它打电话了。查看swift代码 resultCallback = callback 在这里您只需将其分配给另一个变量。你在哪里打过电话? 你需要像callback([NSNull(), [ "success" : true ]])一样打电话。 @ibrahimyilmaz 我在 translateText 方法中调用了该代码,该方法在 callbackMethod 中调用。再次检查我的代码 【参考方案1】:

我认为错误出现在问题的标题中。您的 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

【讨论】:

以上是关于方法不是公认的客观 c 方法的主要内容,如果未能解决你的问题,请参考以下文章

@throws 或 NSError 哪个适用于客观 C api 类型的方法

一种基于FSIM对视频编码图像质量客观评价的方法

客观 c subStringToIndex 内存泄漏

JSON 请求正文 - 客观 c 格式

这是三元条件吗?:正确(客观)C 语法?

什么是面向对象?