如何从swift视图发出事件以响应本机应用程序

时间:2016-02-17 20:03:28

标签: react-native

我已经在Swift中使用UIButton编写了自定义UIView,并将其桥接以响应本机应用程序。视图显示正确。现在我想在按钮点击时发出事件以反应原生的javascript端。我怎样才能做到这一点?

- 编辑 -

我无法发出事件,因为var bridge: RCTBridge!始终为空。

2 个答案:

答案 0 :(得分:0)

如果您通过Xcode文件>新文件菜单选项将Swift文件添加到您的应用程序。您需要在此标头文件中导入RCTBridgeModule.h

// CalendarManager-Bridging-Header.h
#import "RCTBridgeModule.h"

如果你看一下facebook的例子,那就很简单了。

    //create your class
@objc(CalendarManager)
    class CalendarManager: NSObject {

      @objc func addEvent(name: String, location: String, date: NSNumber) -> Void {
        // Date is ready to use!
      }

    }

@objc用于确保在运行时正确导出所有内容

然后用目标c代码创建一个单独的.m文件,你必须混合这两个。记住swift不支持宏。要导出它,只需将函数包装在RCT_EXTERN_METHOD宏中,您就可以轻松使用事件调度程序

// CalendarManagerBridge.m
#import "RCTBridgeModule.h"

@interface RCT_EXTERN_MODULE(CalendarManager, NSObject)

RCT_EXTERN_METHOD(addEvent:(NSString *)name location:(NSString *)location date:(nonnull NSNumber *)date)
//throw in the event dispatcher if you want
@end

看看这些链接,它将引导您完成整个过程

https://facebook.github.io/react-native/docs/native-modules-ios.html#content

https://colinramsay.co.uk/2015/07/04/react-native-eventemitters.html

答案 1 :(得分:0)

我遇到了同样的问题,下面是我如何解决问题。

Official document与我们的实现略有不同,它只定义ViewManager以将方法和变量公开给js,但我们将ViewManager定义为返回UIView,我们希望从此UIView返回方法和变量。

RCTBridge *bridge桥包含在RCTViewManager中,但请记住我们的ViewManager继承了RCTViewManager类,因此我们仍然可以访问bridge,我们可以通过{{1}从bridgeViewManager

以下是我们如何访问UIView

bridge

CustomUIButtonViewManager.swift

和我们的import Foundation @objc(CustomUIButtonViewManager) class CustomUIButtonViewManager : RCTViewManager { var customButtonView:CustomButtonView! override func view() -> UIView! { customButtonView = CustomButtonView(bridge: self.bridge) return customButtonView } } ,如下所示定义:

CustomButtonView.swift

现在您可以访问此UIView中的import UIKit class CustomButtonView: UIView { var bridge: RCTBridge! init(bridge: RCTBridge!) { this.bridge = bridge //So you have saved the bridge in this View } 变量。 这就是我解决这个问题的方法,希望对你有所帮助。