3

假设我有一个名为ExampleClass.

假设我然后编写这样的代码:

@objc(ExampleClass)
class ExampleClass: NSObject {
  @objc class func exampleFunc() -> Void {

  }
}

像这样使用 Objective-C 文件头:

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

@interface RCT_EXTERN_MODULE(ExampleClass, NSObject)
  RCT_EXTERN_METHOD(exampleFunc)
@end

然后我在我的 React Native 应用程序中使用它,如下所示:

console.log('exampleClass', React.NativeModules.ExampleClass);
console.log('exampleFunc', React.NativeModules.ExampleClass.exampleFunc)

第一个控制台日志产生{exampleFunc: f} 第二个结果undefined

调用函数:React.NativeModules.ExampleClass.exampleFunc()导致应用程序崩溃:

异常“exampleFunc 不是公认的 Objective-C 方法。” 在目标 ExampleClass 上使用参数调用 setupLogger 时抛出(

仅更改 Swift 以使其显示为:

@objc(ExampleClass)
class ExampleClass: NSObject {
  @obj func exampleFunc() -> Void {

  }
}

导致调用该函数(是的)目前什么都不做。

如何公开类级别变量?我正在尝试编写函数式 Swift,并且正在使用类方法来模拟结构。

4

2 回答 2

2

RCT_EXPORT_METHOD()根据我自己的类似问题和此处的一些讨论,我认为问题在于仅适用于实例方法,而不适用于类方法: https ://github.com/facebook/react-native/issues/2311

我的用例是尝试getInstance()为 Swift 单例类连接一个方法。这是有问题的,因为当您NativeModules.ExampleClass从已导出的 javascript 中引用时RCT_EXTERN_MODULE(),RNinit()会自行调用,而您不希望单例(init()参考:https ://samwize.com/2017/02/09/calling- a-view-controller-function-from-react-native/ )

我发现完成此任务的最佳方法非常难看。我有一个虚拟包装类,除了在单例上调用方法之外什么都不做,这是我导出到 Objective C(因此也导出到 React Native)的类。基本上是这样的:

@objc(StupidWrapperClass)
class StupidWrapperClass : NSObject {
    @objc(pseudoSingletonSomeMethod)
    public func pseudoSingletonSomeMethod() {
        let singleton = ActualClass.getInstance()
        singleton.someMethod()
    }
}

然后在 .m 桥文件中:

@interface RCT_EXTERN_MODULE(StupidWrapperClass, NSObject)

RCT_EXTERN_METHOD(pseudoSingletonSomeMethod)

@end

你也可以为类方法做这样的事情:

@objc(StupidWrapperClass)
class StupidWrapperClass : NSObject {
    @objc(pseudoClassMethod)
    public func pseudoClassMethod() {
        ActualClass.theRealClassMethod()
    }
}
于 2019-08-31T05:33:27.637 回答
1

我知道我参加聚会有点晚了,但我最近遇到了同样的问题,我用不同的方法解决了这个问题。除了@thejoelpatrol 上面给出的答案之外,另一种方法是将由 react native 创建的对象引用存储在static您可以访问的某个变量中。然后我们可以随时使用该变量访问 react-native 创建的对象。

每当 React Native 尝试实例化该类时,它都会进入 init。在 init 中,我们可以保存对 RN 创建的对象的引用。

@objc public class MyClass {
    @objc public static var shared: MyClass?

    init() {
        MyClass.shared = self
    }
}

.m桥接文件如下:

@interface RCT_EXTERN_MODULE(MyClass)

RCT_EXTERN_METHOD(myClassMethod)

@end
于 2019-11-22T06:40:57.197 回答