如何在 React Native RCT_EXPORT_VIEW_PROPERTY 宏中指定“整数数组”类型

Posted

技术标签:

【中文标题】如何在 React Native RCT_EXPORT_VIEW_PROPERTY 宏中指定“整数数组”类型【英文标题】:How to specify "Array of Integers" type in React Native RCT_EXPORT_VIEW_PROPERTY macro 【发布时间】:2016-02-12 06:40:22 【问题描述】:

我想将一个整数数组从我的 JS RN 原生 UI 组件传递给我的 swift/objective-C 代码,该代码接受“[Int]”作为属性。以下是我尝试使用 RCT_EXPORT_VIEW_PROPERTY 的方法:

RCT_EXPORT_VIEW_PROPERTY(dataArray, [int])
RCT_EXPORT_VIEW_PROPERTY(dataArray, int *)
RCT_EXPORT_VIEW_PROPERTY(dataArray, Int *)

由于 typeSignature 中的 nil 值,它们都被证明为无效类型,并在下面的 RCTComponentData.m 代码中的 switch 语句中导致 Xcode 异常:

    // Ordinary property handlers
    NSMethodSignature *typeSignature = [[RCTConvert class] methodSignatureForSelector:type];
    switch (typeSignature.methodReturnType[0]) 

我在任何地方都找不到有效类型的列表,我只能猜测。最好弄清楚我可以与 RCT_EXPORT_VIEW_PROPERTY 一起使用的有效类型集是什么。

2015 年 11 月 12 日更新 - 找到了可行的解决方案,根据 Nick Lockwood 的建议,我做了以下更改:

在 RN_MyCustomerViewManager.m 文件中(您可以使用任何名称命名此文件,只要它是导入 Obj-c 桥接头文件的 Obj-C .m 文件)

RCT_EXPORT_VIEW_PROPERTY(dataArray, NSNumberArray)

在 MyCustomerView.swift 文件中

func setDataArray(dataArray: [Int]) …

func setDataArray(dataArray: [Int]?) …

现在整数数组被传入了。

我还发现有效的 RCT_EXPORT_VIEW_PROPERTY 类型是在 React Native RCTConvert.h 中定义的,因此如果您需要定义自己的 Native UI 组件,请将该文件放在手边

【问题讨论】:

请注意,您还可以通过使用类别扩展 RCTConvert 来定义新的支持类型。然而,这些类型也需要与 Objective-C 兼容。 【参考方案1】:

React Native 是一个 Objective-C 库,因此我们只支持可以桥接到 Objective-C 的 Swift 类型子集。

swift 类型[Int] 根本无法在Objective-C 中表示。你能得到的最接近的是NSArray<NSNumber *> *,它与[Int] 不直接兼容。要在 React Native 中导出 NSNumber 数组属性,您可以使用

RCT_EXPORT_VIEW_PROPERTY(dataArray, NSNumberArray)

但是,您可能需要在 Swift 方面将类型更改为 [NSNumber]?[AnyObject]?(注意 ? 后缀,因为视图属性在 React 中都是可以为空的),或者如果可以不要那样做,导出另一个名称为[AnyObject]? 类型的第二个属性,然后在该属性的设置器中,将值映射到您的实际[Int] 属性。

【讨论】:

以上是关于如何在 React Native RCT_EXPORT_VIEW_PROPERTY 宏中指定“整数数组”类型的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React Native 中使用 React Native Video 显示多个视频? [关闭]

如何在React Native上创建多个屏幕?

如何在React Native中使用CreateBottomTabNavigator?

如何在 React Native 中的循环中查找

如何在 react-native 中定位移动应用的用户?

React native-如何在 react native 中只显示一次登录屏幕?