在 Swift 中实现 RCTEventEmitter 但未设置桥接的接收异常 [英] Implement RCTEventEmitter in Swift but receive exception for bridge is not set
问题描述
我正在尝试在 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屋!