在 Swift 中实现 RCTEventEmitter 但未设置桥接的接收异常 [英] Implement RCTEventEmitter in Swift but receive exception for bridge is not set

查看:46
本文介绍了在 Swift 中实现 RCTEventEmitter 但未设置桥接的接收异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在 Swift 中为 React Native 实现一个事件发射器,以便我可以在我的一些本机模块中重用它.但是,当我从 iOS 本地发送事件时,收到以下错误

I am trying to implement an event emitter for React Native in Swift so that I can reuse it across some of my native modules. However, when I send event natively from iOS, I received the following error

Bridge is not set. This is probably because you've explicitly synthesized the bridge in MyEventEmitter, even though it's inherited from RCTEventEmitter.

/// MyEventEmitter.m
#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
#import <React/RCTEventEmitter.h>

@interface RCT_EXTERN_MODULE(MyEventEmitter, RCTEventEmitter)

RCT_EXTERN_METHOD(supportedEvents)

@end

在 Swift 中的实现:

Implementation in Swift:

import Foundation

@objc(MyEventEmitter)
class MyEventEmitter: RCTEventEmitter {

    public static let shared = MyEventEmitter()

    override func supportedEvents() -> [String]! {
        return [
            ... // my event list
        ]
    }
}

在我的原生 swift 代码中,我通过

In my native swift code, I initialized the emiter by

private let eventEmitter: MyEventEmitter = .shared

// send event
self.eventEmitter.sendEvent(withName: "someEvent", body: nil)

我还将 放在我的桥接头中.

I also put <React/RCTBridgeModule.h> and <React/RCTEventEmitter.h> inside my bridging header.

我在这里做错了什么?

推荐答案

我发现的问题是你不能在 public static let shared = MyEventEmitter() 中自己实例化 MyEventEmitter

The problem I found was that you must not instantiate the MyEventEmitter yourself aka in public static let shared = MyEventEmitter()

你应该重写 init 方法并将 self 分配给 shared

You should rather override the init method and assign self to shared

import Foundation

@objc(MyEventEmitter)
class MyEventEmitter: RCTEventEmitter {

    public static var shared:MyEventEmitter?

    override init() {
        super.init()
        MyEventEmitter.shared = self
    }

    override func supportedEvents() -> [String]! {
        return [
            ... // my event list
        ]
    }
}

这是因为 RN 会自己实例化对象并分配桥,而当你自己做时,桥不会被分配.

This is because RN will instantiate the object itself already and assign the bridge, whereas when you are doing it yourself the bridge will not be assigned.

这篇关于在 Swift 中实现 RCTEventEmitter 但未设置桥接的接收异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆