调用RCTDirectEventBlock不会触发JS代码

时间:2016-09-11 20:32:55

标签: objective-c swift react-native

我正在尝试为react-native编写本机UI组件,而我在查明事件系统的工作方式时遇到了一些麻烦。我已经阅读了文档,不幸的是它并没有特别有用,主要是因为它特定于obj-c,我不太舒服。对Swift也不太满意,但这是我目前正在努力学习的语言。下面的代码是我到目前为止,我的应用程序加载得很好(在XCode中没有问题)。

CustomViewManager.swift

import Foundation

@objc(CustomViewManager)
class CustomViewManager : RCTViewManager {
  override func view() -> UIView! {
    return CustomView();
  }
}

CustomViewManagerBridge.m

#import "RCTBridgeModule.h"
#import "RCTViewManager.h"

@interface RCT_EXTERN_MODULE(CustomViewManager, RCTViewManager)

RCT_EXPORT_VIEW_PROPERTY(onPress, RCTDirectEventBlock)
RCT_EXPORT_VIEW_PROPERTY(list, NSArray)

@end

CustomView.h

#import "RCTView.h"
@interface CustomView : RCTView
@property (nonatomic, assign) NSArray *list;
@property (nonatomic, copy) RCTDirectEventBlock onPress;
@end

CustomView.swift

import Foundation
import UIKit

@objc(CustomView)
class CustomView : UIView {

  var list: [CGFloat]? {
    didSet {
      print("set list")
    }
  }

  override init(frame: CGRect) {
    super.init(frame: frame);
  }

  required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }

  func setOnPress(callback: RCTDirectEventBlock) {
    print("set onPress", callback)
    let dict:[NSObject:AnyObject] = [
      "hello": "world",
      ]
    callback(dict)
  }

}

然后使用以下代码从反应中调用它:

<CustomView list={[1,2,3]} onPress={data => console.log('js', data)} />

这在一定程度上工作正常。我可以访问从swift代码传递的道具。我得到了列表和onPress函数。 但是,当我致电callback时,console.log未被触发,我不确定原因。任何帮助都将不胜感激。

谢谢, 戈尔丹

1 个答案:

答案 0 :(得分:0)

确定,

原来我使用了错误的属性类型。将RCTDirectEventBlock更改为RCTBubblingEventBlock就可以了。