Собственный модуль React Native — передача JSON prop в Swift UIView

#ios #objective-c #swift #react-native

#iOS #objective-c #swift #react-native

Вопрос:

Я создаю собственный модуль в своем проекте RN, который включает представление с JSON prop следующим образом:

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

Представление встроено в Swift, и у меня есть установщик для name prop. Вот моя текущая настройка

 // 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...
  }
}
  

Мне было интересно, есть ли способ преобразовать это свойство в a struct , чтобы я мог вложить дополнительный JSON или выдать ошибку, если определенные поля отсутствуют.

Если я правильно понимаю документы, похоже, я мог бы использовать RCT_CUSTOM_VIEW_PROPERTY и RCTConvert преобразовать свойство в определенный тип, но я не совсем понимаю, как это сделать в сочетании со 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