【问题标题】:Get variables from Swift file with Native Modules for React Native?使用 React Native 的 Native Modules 从 Swift 文件中获取变量?
【发布时间】:2019-12-15 11:23:03
【问题描述】:

我有 React Native 应用程序,我需要使用 RCT_EXTERN_METHOD 宏在 IOS 上实现原生模块。 我的步骤:

  1. XCode 中创建了 Settings.swift 文件。

  2. 已创建桥接 - 标头。

  3. XCode 中创建了 Settings.m 文件。

  4. Xcode 的 Settings.swift 文件中声明了 Class 组件以及内部变量和函数。

  5. 在 XCode 中使用 RCT_EXTERN_METHOD 宏在 Settings.m 文件中注册函数。

  6. 导入Native Modules并在React Native项目中使用。

我需要使用我的 swift 文件中的变量,例如我的 React Native 项目中的状态,并使用 Swift 文件中声明的函数来管理它。当我调用该函数时,它可以工作,但我无法从 Native Modules 中获取变量,例如 NativeModules.Settings.getSwitchGeneralTagLog 我不确定。你能告诉我如何从 Native Module 中获取变量吗?它是用于状态的好方法吗? Swift 中管理状态的最佳方式是什么?

Settings.swift:

import Foundation

@objc(Settings)
class Settings: NSObject {


  private var generalTagLog = false

  @objc
  func getSwitchGeneralTagLog() -> Bool {
    return generalTagLog
  }

  @objc
  func switchGeneralTagLog() -> Bool {
    return generalTagLog ? false : true
  }


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

设置.m:

#import <Foundation/Foundation.h>
#import "React/RCTBridgeModule.h"

@interface RCT_EXTERN_MODULE(Settings, NSObject)
RCT_EXTERN_METHOD(switchGeneralTagLog)

@end

【问题讨论】:

  • 您可以创建一个函数来从 Swift 中返回变量。
  • 我已经尝试过使用函数并得到错误:警告:道具类型失败:提供给function 类型的无效道具value Switch,预期boolean
  • 请告诉我你创建函数的部分和调用它的部分。
  • 这两个代码是一样的。

标签: objective-c swift xcode react-native macros


【解决方案1】:

我将专注于一个功能,您可以在此基础上对其进行扩展

设置.m


RCT_EXTERN_METHOD(getSwitchGeneralTagLog:(RCTPromiseResolveBlock)promise rejector: (RCTPromiseRejectBlock)reject)

在下面的场景中,我们没有处理任何异常

Settings.swift


 @objc func getSwitchGeneralTagLog(_ promise: RCTPromiseResolveBlock, rejector reject: RCTPromiseRejectBlock) {

    var isSwitch = false 

     // figure out what need to be done for the flag 

    promise(isSwitch)
  }

在您的 RN Accept 中,您可以从 Promise 中提取结果并使用它。

【讨论】:

  • 这涉及到一个承诺。我想知道如何调用函数并同步返回结果。
  • 由于 JS 是单线程的,所以最好遵循这种方法。在 JS 层使用await 确保返回值,然后再在 JS 层进行下一步
  • 这就是我实现它的方式。但是我想知道如何同步进行。
  • @HarveyConnor 你找到答案了吗?我也想同步。但是,如果它同步执行 - 返回值在 js 中未定义,在 swift 值中 - 显示正常
  • @HarveyConnor 我找到了答案。 RN Doc 说“桥接方法的返回类型始终为 void。React Native 桥接是异步的,因此将结果传递给 JavaScript 的唯一方法是使用回调或发出事件(见下文)。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 1970-01-01
相关资源
最近更新 更多