#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