我如何从 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.swiftCustomCollectionViewLayout.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 组件的双向绑定?

使用 Swift 反应原生自定义 UI 组件:如何在事件中访问 reactTag

微信小程序如何将接口获取的数据传递给自定义组件

在 Swift 中的视图控制器之间传递自定义类数据