React Native 到 Swift 桥 - 传递参数和回调

Posted

技术标签:

【中文标题】React Native 到 Swift 桥 - 传递参数和回调【英文标题】:React Native to Swift bridge - passing both a parameter and a callback 【发布时间】:2020-09-03 20:21:40 【问题描述】:

我正在尝试将 base64 图像字符串发送给 swift,并且我希望在我的回电中返回给我的图像分类。但是,我可以传递一个字符串,并且可以成功地单独传递一个回调,但是当我将它们加在一起时,我会收到:

Exception 'bothClassifyAndCallback: is not a recognized Objective-C method.

这是我的 bridge.m - 注意方法分类和 myCallback 工作正常

#import "React/RCTBridgeModule.h"

@interface RCT_EXTERN_MODULE( ImageClassifier, NSObject )
    RCT_EXTERN_METHOD( classify: (NSString*)img  )
    RCT_EXTERN_METHOD( myCallback: (RCTResponseSenderBlock)callback )
    RCT_EXTERN_METHOD( bothClassifyAndCallback: (NSString*)img (RCTResponseSenderBlock)callback)
@end 

这是我的 bridge.swift 文件

import Foundation

@objc( ImageClassifier )
class ImageClassifier: NSObject 

  @objc
  func classify( _ img: String )  
    print( img )
  

  @objc 
  func myCallback( _ callback: RCTResponseSenderBlock ) 
      callback([ "From swift to js" ]) 
  
  
  @objc 
  func bothClassifyAndCallback( _ img: String, _ callback: RCTResponseSenderBlock )  
    print( img )
    return callback( [ "recieving and returning to js" ] )

  

  @objc
  static func requiresMainQueueSetup() -> Bool 
      return true
  


这是我在 react native 中的调用

class BridgeTest extends React.Component 
    constructor() 
        super()
        this.classifier = NativeModules.ImageClassifier 
    
    onPress = () => 
        this.classifier.classify( "from js" )                                          // this works
        this.classifier.myCallback( ( arg ) =>  console.log( "my arg is" + arg )  ) // This works
        this.classifier.bothClassifyAndCallback( "argument", ( arg ) =>  console.log( "my arg is " + arg ) )
     


render() 
    return( <Button title="bridge" onPress=this.onPress></Button> )

export default BridgeTest

我怀疑我在这里错了:

RCT_EXTERN_METHOD( bothClassifyAndCallback: (NSString*)img (RCTResponseSenderBlock)callback)

但是在尝试了几种变体之后,我无法让它发挥作用。谢谢。

【问题讨论】:

【参考方案1】:

您需要对bothClassifyAndCallback 进行轻微修改 ImageClassifierbridge.m 用于 @objc 声明。

图像分类器

@objc(bothClassifyAndCallback: resolver:) 
    
      func bothClassifyAndCallback( _ img: String, resolver callback: RCTResponseSenderBlock )  
        print( img )
        return callback( [ "recieving and returning to js" ] )
    
      

Bridge.m

RCT_EXTERN_METHOD( bothClassifyAndCallback: (NSString*)img resolver: (RCTResponseSenderBlock)callback)

【讨论】:

整整一年后。我终于可以完成了哈哈!谢谢。

以上是关于React Native 到 Swift 桥 - 传递参数和回调的主要内容,如果未能解决你的问题,请参考以下文章

React Native Swift 模块中的回调函数

如何将 React Native Promise 连接到 Swift

React-Native:无法触发 Native UIButton 触摸事件

将现有的移动应用程序从 Android Native(Java) 和 IOS Native(Swift) 迁移到 React Native

纯在 Swift 中的 React Native 应用程序

在 React Native 模块中将 Swift 类导入 Obj-C