使用Swift重用本机自定义UI组件:如何在事件

时间:2015-11-03 17:10:26

标签: react-native

在Swift中创建自定义UI组件时,如何访问reactTag以将事件触发回React Native?

使用以下代码在Swift中创建一个具有按钮的自定义组件: 单击该按钮后,使用bridge.eventDispatchersendInputEventWithName应该会在React Native JavaScript代码中引发一个事件。 这是通过将reactTag作为事件字典的一部分传递来完成的。 但是,我不清楚如何访问reactTag属性,甚至可以访问它。

(稍微挖掘它似乎出现在名为RCTShadowView的东西上,但是在我的shadowView上,reactTag总是nil

夫特

//  FooView.swift
import UIKit


@objc(FooView)
class FooView: UIView {
    @objc var bridge: RCTBridge!

    required override init(frame: CGRect) {
        super.init(frame: frame)
        let button = UIButton(frame: CGRect(x: 10, y: 10, width: 244, height: 244))
        button.addTarget(self, action: "buttonClicked:", forControlEvents: .TouchUpInside)
        self.addSubview(button)
    }

    func buttonClicked(sender: AnyObject?) {
        let event = [
            "target": "", // <-- how can one get access to the reactTag property?
        ]

        self.bridge.eventDispatcher.sendInputEventWithName("topChange", body: event)
    }
}

目标C

//  FooViewBridge.m

#import "RCTBridgeModule.h"
#import "RCTViewManager.h"
#import "FooProj-Swift.h"


@interface RCTFooViewManager : RCTViewManager
@end


@implementation RCTFooViewManager


RCT_EXPORT_MODULE()

- (UIView *)view
{
    FooView* fooView = [[FooView alloc] init];
    fooView.bridge = self.bridge;
    fooView.shadowView = self.shadowView; // <-- was hoping this would have a reactTag but it's always nil
    return fooView;
}


@end

1 个答案:

答案 0 :(得分:2)

FooView.swift需要能够看到在self.reactTag中声明的UIView+React.h

这需要添加到项目的Bridging-Header.h

#import "UIView+React.h"

旁注:您可能不想直接使用sendInputEventWithName,但使用的答案的Swifty变体here