在iOS编程方面,我是一个完全的初学者。我有一个React本机应用程序,我已经制作了一个到Swift模块的本机桥。我想要实现的是能够从Reactive原住民启动一个本机ViewController页面,然后关闭ViewController并发送包含数据的事件以响应本机。
我编辑了以下文件:
Brygga.m (My ObjC bridge between React-Native and Swift)
Bridge-Test-Bridging-Header.h (Bridging-Header file)
ConnectingFile.swift (My Swift classes and methods)我有以下文件:
根据我读过的教程,要将事件从本机发送到React-本机,我们必须使用RCTEventEmitter。但是我不能从一个ViewController子类启动一个RCTEventEmitter,所以我创建了两个类。
一个是UIViewController的子类,另一个是RCTEventEmitter的子类。我已经成功地启动了我的ViewController,但是当我试图从ViewController发送事件数据时,通过ViewController类响应本机;我得到了错误
“桥没有设置,这可能是因为您在Brygga中显式地合成了桥,尽管它是从RCTEventEmitter继承的。”
ConnectingFile.swift
import Foundation
@objc(Connect)
class Connect: UIViewController, MiSnapWorkflowViewControllerDelegate{
func didFinishWithResults(resultsDictionary: [String : Any]) {
let event: brygga = Brygga()
brygga.Finished(data: "Hello")
}
@objc func startViewController() {
DispatchQueue.main.async {
let vc = MiSnapWorkflowViewController.init(with: [.passport, .selfie])
vc.delegate = self
let navigationController = UINavigationController(rootViewController: vc)
navigationController.modalPresentationStyle = .fullScreen
let topViewController = UIApplication.shared.keyWindow?.rootViewController
topViewController?.present(navigationController, animated: true, completion: nil)
}
}
}
@objc(Brygga)
class Brygga: RCTEventEmitter {
@objc
func Finished(data: String) {
sendEvent(withName: "onFinished", body: ["data": data])
}
override func supportedEvents() -> [String]! {
return ["onFinished"]
}
override static func requiresMainQueueSetup() -> Bool {
return true
}
}Brygga.m
#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
#import <React/RCTEventEmitter.h>
#import <React/RCTViewManager.h>
@interface RCT_EXTERN_MODULE(Brygga, RCTEventEmitter)
RCT_EXTERN_METHOD(Finished)
@end
@interface RCT_EXTERN_MODULE(Connect, RCTViewManager)
RCT_EXTERN_METHOD(goToNative)
@endBridgeTest-Bridging-Header.h
#import <React/RCTBridgeModule.h>
#import <React/RCTBridge.h>
#import <React/RCTEventDispatcher.h>
#import <React/RCTEventEmitter.h>
#import <React/RCTRootView.h>
#import <React/RCTUtils.h>
#import <React/RCTConvert.h>
#import <React/RCTBundleURLProvider.h>
#import <React/RCTViewManager.h>我认为这可能与我如何从我的RCTEventEmitter启动ViewController类有关。这家伙有一个相似的问题,但我不明白解决办法
Implement RCTEventEmitter in Swift but receive exception for bridge is not set
发布于 2021-08-10 19:05:28
我终于解决了。下面是从不扩展RCTEventEmitter的其他类中发送事件的解决方案,例如,如果您喜欢我,希望从扩展UIViewController的类中发送事件。
你的斯威夫特桥应该包括以下几个部分:
Bridge.m
@interface RCT_EXTERN_MODULE(RNEventEmitter, RCTEventEmitter)
RCT_EXTERN_METHOD(supportedEvents)
@endRNEventEmitter.swift
@objc(RNEventEmitter)
open class RNEventEmitter: RCTEventEmitter {
public static var emitter: RCTEventEmitter!
override init() {
super.init()
RNEventEmitter.emitter = self
}
open override func supportedEvents() -> [String] {
["onFinished", "onPending"] // etc.
}
}MyViewController.swift
func sendEvent(_ name: String, body: [String : Any]) {
RNEventEmitter.emitter.sendEvent(withName: name, body: body)
}然后从任何地方sendEvent("onFinished",“本机进程已经完成!”)
当然,你也需要在反应本土方面接受这一点。我也可以向你展示你是如何做到的;
App.js
import {NativeModules, NativeEventEmitter} from 'react-native';
const {RNEventEmitter} = NativeModules;
const eventEmitter = new NativeEventEmitter(RNEventEmitter);
eventEmitter.addListener('onFinished', res =>
console.log(res.data),
);https://stackoverflow.com/questions/68712655
复制相似问题