我如何从 js 世界中传递 swift 自定义组件的属性
Posted
技术标签:
【中文标题】我如何从 js 世界中传递 swift 自定义组件的属性【英文标题】:how could I pass swift custom component's properties from js world 【发布时间】:2016-02-26 13:11:52 【问题描述】:我有 swift 编写的自定义组件,我想从 js 世界传递一些自定义属性,
但我真的不知道怎么做,下面提供一些主要代码。
Demo-Bridging-Header.h
#import "RCTBridgeModule.h"
#import "RCTViewManager.h"
CollectionViewManagerBridge.m
#import "RCTView.h"
#import "RCTViewManager.h"
@interface RCT_EXTERN_MODULE(CollectionViewManagerSwift, RCTViewManager)
@end
CollectionViewManagerSwift.swift
@objc(CollectionViewManagerSwift)
class CollectionViewManagerSwift : RCTViewManager, UICollectionViewDataSource, UICollectionViewDelegate
let contentCellIdentifier = "CellIdentifier"
var collectionView: UICollectionView
override init()
let layout = CustomCollectionViewLayout()
let collectionView = UICollectionView(frame: CGRectZero, collectionViewLayout: layout)
collectionView.registerClass(CustomCell.self, forCellWithReuseIdentifier: contentCellIdentifier)
collectionView.directionalLockEnabled = false
collectionView.backgroundColor = UIColor.whiteColor()
self.collectionView = collectionView
override func view() -> UICollectionView!
self.collectionView.delegate = self
self.collectionView.dataSource = self
return self.collectionView;
// ... some other code
另外我还有上面用到的CustomCell.swift和CustomCollectionViewLayout.swift,
当我在 js 世界的 render()
方法中调用 <CollectionViewManagerSwift />
时,这些代码工作正常,
但是我如何从 js 世界中传递属性,例如 <CollectionViewManagerSwift customProperty=customProperties />
,以及如何在我的 swift 代码中定义 customProperty
?
也许我没有表达清楚,谢谢你的时间。
跟进
我尝试在 CollectionViewManagerBridge.m
中添加customProperty
#import "RCTView.h"
#import "RCTViewManager.h"
@interface RCT_EXTERN_MODULE(CollectionViewManagerSwift, RCTViewManager)
RCT_CUSTOM_VIEW_PROPERTY(customProperty, NSArray, CollectionViewManagerSwift)
NSLog(@"%@ -- %@", json[0], json[1]);
@end
然后我从 js 世界中调用它
<CollectionViewManagerSwift customProperty=['foo', 'bar'] />
我在 Xcode 输出中得到值
2016-02-27 17:58:07.167 Demo[49690:12639774] foo -- bar
但我怎样才能在 CollectionViewManagerSwift.swift 中获得customProperty
?
再次感谢。
问候
【问题讨论】:
我无法弄清楚这一点,所以我不得不混合代码来让我的工作。我在 react-native 站点中找到了这个。在您的自定义原生组件中使用RCT_CUSTOM_VIEW_PROPERTY
宏导出属性,然后在 React Native 中使用它们,就像该组件是一个普通的 React Native 组件一样。记住跨语言属性不支持callbacks
@AKADER 请看我的后续内容,我试试你的话,但我不知道在我的快速来源中获得该属性:(
@E_Jovi 很想知道你是否曾经得到这个工作。我们遇到了同样的问题。有一个带有工作示例的回购链接。
【参考方案1】:
您需要:“实现 -(UIView *)view 方法”,如本文档中所述:http://facebook.github.io/react-native/docs/native-components-ios.html#content
您可以在此处初始化您的 CollectionView。
【讨论】:
感谢您的建议,我已经在上面的代码中从CollectionViewManagerSwift.swift
调用了view
方法,但我不知道如何在swift 代码中定义从js 世界传递的属性:( 【参考方案2】:
不确定是否有其他方法(更好的方法)来实现它。
无论如何,我有一个用 swift 编写的 UI 库,并且我想为 RN 创建一个模块(节点 + pod),以便我可以在其他 RN 项目中使用它。
@objc(SampleSwiftViewManager)
public class SampleSwiftViewManager:RCTViewManager
@objc(setSrc:)// --> this is important
public func setSrc(obj:Dictionary<String, Any>)
guard let currentView = obj["view"] as? SampleSwiftView,
let src = obj["json"] as? String else
return
currentView.setSrc(src: src)
public override func view() -> UIView!
return SampleSwiftView()
class SampleSwiftView: UIView
// custom view implementation ....
// example prop method
func setSrc(src:String)
// ....
在 Objective-C 中
#import <Foundation/Foundation.h>
#import <React/RCTViewManager.h>
#import <React/RCTUIManager.h>
@interface RCT_EXTERN_MODULE(SampleSwiftViewManager, RCTViewManager)
RCT_CUSTOM_VIEW_PROPERTY(src, NSString, NSObject)
[self performSelector:@selector(setSrc:) withObject:@@"view":view, @"json":json];
@end
【讨论】:
以上是关于我如何从 js 世界中传递 swift 自定义组件的属性的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 的自定义单元格中获取值组件的 indexPath?
如何创建从 vue.js 实例到自定义原生 Web 组件的双向绑定?