将方法从快速或本机方法导出到react-native

时间:2019-04-01 10:43:40

标签: objective-c swift react-native

我有一个快速的类,我将其暴露给react-native,在其中,我有一个也暴露给react-native的函数。现在,当响应本机调用该函数时,它会在内部执行很多操作,但是在某个时间点后,它将返回一个对象。

现在它将调用将获取对象的特定函数。我无法将参数更改为该函数。但是我还有另一个功能,我想返回该功能以进行本地响应。我该怎么办。

  func AckCallback(response:APIResponse) -> Void
  {
    print(response)  

  }

对于此函数,我无法更改参数表,因为它已被使用很多地方,但是我想将该函数的响应返回到本机响应。如果有人知道这个问题,请告诉我。

  @objc func sendEvent(_ response: APIResponse, callback: (NSObject) -> ()) 
-> Void {

    callback( [[
      "responseCode" : "Working",
      ]] as NSObject)

  }

我只想知道如何在AckCallback中使用此sendEvent,或者是否有其他方法可以发送该**

  

响应:APIResponse

**

本机反应。

2 个答案:

答案 0 :(得分:1)

对于第一个创建的Swift类(例如YourModule.swift

//
//  YourModule.swift
//

@objc(YourModule)
class YourModule: NSObject {

  @objc func callNativeEvent(callback:RCTResponseSenderBlock) 
-> Void {

   // Here you can do your work and pass an object to the callback function.
  // You can save assign a `callback` to the class property (e.g self.eventCallback = callback)
// and invoke that self.eventCallback after the asynchronous code ol somewhere else
  NSObject *obj = [[NSObject alloc] init]; // your object here
   callback([NSNull(), obj]);
   // or if you want to return an error
   // callback(["Error calling NativeEvent", NSNull()]);

  // I'm not sure that RCTResponseSenderBlock works the same as in previous react-native versions. Maybe now you can pass an Object instead of an Array.
  }
}

创建Bridge文件(例如YourModuleBridge.m

//
//  YourModuleBridge.m
//

#import <Foundation/Foundation.h>
#import "UIKit/UIKit.h"

#import <React/RCTBridgeModule.h>


@interface RCT_EXTERN_MODULE(YourModule, NSObject)

RCT_EXTERN_METHOD(callNativeEvent:(RCTResponseSenderBlock)callback);

@end

此外,如果您的项目中不存在Bridging-Header文件,则需要使用该文件。

//
//  YourModule-Bridging-Header.h
//

#ifndef YourModule_Bridging_Header_h
#define YourModule_Bridging_Header_h

#if __has_include("RCTBridgeModule.h")
#import "RCTBridgeModule.h"
#else
#import <React/RCTBridgeModule.h>
#endif

#endif /* YourModule_Bridging_Header_h */

从JS <​​/ p>

import { NativeModules } from 'react-native';

const YourModule = NativeModules.YourModule;

...

YourModule.callNativeEvent((error, response) => {
  console.log('Error', error, 'Response', response);
});

答案 1 :(得分:1)

在iOS项目中创建2个文件

SwiftComponentManager.swift and SwiftComponentManager.m  create these 2 files. 

SwiftComponentManager.swift ->

@objc(SwiftComponentManager)
class SwiftComponentManager: NSObject {

@objc func passValueFromReact(_ value : String) {
    debugPrint(" Print Here \(value)")
 }
}

在SwiftComponentManager.m

#import <Foundation/Foundation.h>

#import "React/RCTBridgeModule.h"
@interface RCT_EXTERN_MODULE(SwiftComponentManager, NSObject)

  RCT_EXTERN_METHOD(passValueFromReact:(NSString *)value) //Here exported your swift function for React Native 
@end

在React-Native项目中开始工作

现在如何在React Native中调用此Swift函数。

将您的SwiftComponent导入 React JS 文件

const { SwiftComponentManager } = NativeModules

现在在JS文件中的所需位置调用函数值

SwiftComponentManager.passValueFromReact("Hello World")