Как вызвать встроенную функцию swift из react native?

#objective-c #swift #react-native

#objective-c #swift #react-native

Вопрос:

У меня есть класс swift, который я предоставляю для react-native, внутри которого у меня есть функция, которая также доступна для react-native. Теперь, когда react native вызывает эту функцию, она выполняет многое из этого внутренне, но через какой-то момент времени возвращает объект.

Теперь он вызовет определенную функцию, которая получит объект. Я не могу изменить параметр для этой функции. Но у меня есть другая функция, к которой я хочу вернуться в react native. Как я могу это сделать.

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

  }
  

для этой функции я не могу изменить paremeter, потому что он использовался во многих местах, но я хочу вернуть этот ответ из этой функции в react-native. Если кто-нибудь знает об этой проблеме, пожалуйста, дайте мне знать.

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

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

  }
  

Я просто хочу знать, как использовать это SendEvent внутри AckCallback, или есть какой-либо другой способ отправить это **

ответ: APIResponse

**

для react-native.

Ответ №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.
  }
}
  

Создайте файл моста (например 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

 import { NativeModules } from 'react-native';

const YourModule = NativeModules.YourModule;

...

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

Комментарии:

1. Спасибо за помощь, но у меня есть несколько зарегистрированных обратных вызовов с этим, и у них есть 3 функции, основанные на активности в функции «callNativeEvent», которая вызовет любую из этих трех функций. Теперь у меня есть три функции для вызова, и все три определения определены, я не могу это изменить, но мой зарегистрированный обратный вызов может вызывать кого угодно из этого, оттуда я хочу вернуть что-то в свой обратный вызов react native. Я попробовал другой вариант отправки уведомления из файла swift, но он выдает ошибку. self.bridge.EventDispatcher()?.sendAppEvent(с именем: eventName, тело: «тестирование»)

2. Вы можете попробовать расширить из RCTEventEmitter и вызвать self.sendEvent(withName: "yourEventName", body: ["key": "value"]) . В этом случае вам нужно переопределить supportedEvents и вернуть массив имен событий ( [«yourEventName»]) А в JS import { NativeModules, NativeEventEmitter } from ''react-native; const myModuleEvt = new NativeEventEmitter(NativeModules.MyModule); myModuleEvt.addListener('yourEventName', (data) => console.log(data)) Вы можете найти пример ObjectiveC здесь facebook.github.io/react-native/docs /…

3. @objc функция callNativeEvent(_ callback: RCTResponseSenderBlock) -> Void { Те, кто использует последнюю версию swift, пожалуйста, добавьте подчеркивание перед параметром

Ответ №2:

В проекте 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

Теперь, как будет вызываться эта функция Swift в React Native.

Импортируйте свой SwiftComponent в React JS файл

 const { SwiftComponentManager } = NativeModules
  

Теперь вызовите свою функцию со значением, которое вы хотите, в файле JS

 SwiftComponentManager.passValueFromReact("Hello World")
  

Комментарии:

1. Я получил ошибку: TypeError: null is not an object (evaluating 'SwiftComponentManager.passValueFromReact')

2. Это работает, я забыл проверить m file в Target Membership на правой панели