React Native Native Module - 将 JSON 属性传递给 Swift UIView

Posted

技术标签:

【中文标题】React Native Native Module - 将 JSON 属性传递给 Swift UIView【英文标题】:React Native Native Module - Passing JSON prop to Swift UIView 【发布时间】:2020-10-26 20:08:53 【问题描述】:

我正在我的 RN 项目中创建一个本地模块,其中包含一个带有 JSON 属性的视图,如下所示:

<MyNativeView name= firstName: "John", lastName: "Doe"  />

视图是用 Swift 构建的,我有一个用于 name 属性的设置器。这是我目前的设置

// MyNativeViewManager.m
#import "React/RCTViewManager.h"

@interface RCT_EXTERN_MODULE(MyNativeViewManager, RCTViewManager)
RCT_EXPORT_VIEW_PROPERTY(name, NSDictionary *)
@end
// MyNativeViewManager.swift
@objc(MyNativeViewManager)
class MyNativeViewManager: RCTViewManager 
  override func view() -> UIView! 
    return MyNativeView()
  

  // ...


// MyNativeView.swift
class MyNativeView: UIView 
  @objc(setName:)
  func setName(name: NSDictionary) 
    var firstName: String?
    var lastName: String?

    // This feels ugly... but does the job
    if let firstNameProp = name["firstName"] as? String 
      firstName = firstNameProp
    

    if let lastNameProp = name["lastName"] as? String 
      lastName = lastNameProp
    

    // Do stuff...
  

我想知道是否有办法将此属性转换为 struct,这样我就可以嵌套额外的 JSON 或在缺少特定字段时抛出错误。

如果我对文档的理解正确,看起来我可以使用 RCT_CUSTOM_VIEW_PROPERTYRCTConvert 将属性转换为定义的类型,但我不清楚如何与 Swift 结合使用。

【问题讨论】:

【参考方案1】:

你可以这样做,

/// Custom View (Swift)
@objc
class MyNativeView: UIView 
  
  @objc
  func setName(nameParts:[String: String]) 
    // your logic..
  

/// View Manager (Swift)
@objc(MyNativeViewManager)
class MyNativeViewManager: RCTViewManager 
  override func view() -> UIView! 
    return MyNativeView()
  

@interface RCT_EXTERN_MODULE(MyNativeViewManager, RCTViewManager)

RCT_CUSTOM_VIEW_PROPERTY(name, NSDictionary, MyNativeView) 
  // do your validation....
  
  // Post validation
  // 'json' is the parameter you will get here and whose type is NSDictionary
  // 'view' is the current view and whose type is MyNativeView
  [view setNameWithNameParts:json];


@end

【讨论】:

以上是关于React Native Native Module - 将 JSON 属性传递给 Swift UIView的主要内容,如果未能解决你的问题,请参考以下文章

添加 React-Native-Camera 和 React-Native-Push-Notification 后无法构建 React Native

react native 增加react-native-camera

更新 react-native-maps 以使用 create-react-native-app

react-native init 指定 react 版本和 react-native 版本

react native 增加react-native-storage

什么是 react-native-cli 和 @react-native-community/cli?