首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将事件从ViewController发送到React本机

将事件从ViewController发送到React本机
EN

Stack Overflow用户
提问于 2021-08-09 13:11:18
回答 1查看 640关注 0票数 2

在iOS编程方面,我是一个完全的初学者。我有一个React本机应用程序,我已经制作了一个到Swift模块的本机桥。我想要实现的是能够从Reactive原住民启动一个本机ViewController页面,然后关闭ViewController并发送包含数据的事件以响应本机。

我编辑了以下文件:

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
#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)

@end

BridgeTest-Bridging-Header.h

代码语言:javascript
复制
#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

EN

回答 1

Stack Overflow用户

发布于 2021-08-10 19:05:28

我终于解决了。下面是从不扩展RCTEventEmitter的其他类中发送事件的解决方案,例如,如果您喜欢我,希望从扩展UIViewController的类中发送事件。

你的斯威夫特桥应该包括以下几个部分:

  • Bridge.m
  • RNEventEmitter.swift
  • MyViewController.swift (或您的任何其他类)

Bridge.m

代码语言:javascript
复制
@interface RCT_EXTERN_MODULE(RNEventEmitter, RCTEventEmitter)

RCT_EXTERN_METHOD(supportedEvents)

@end

RNEventEmitter.swift

代码语言:javascript
复制
@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

代码语言:javascript
复制
  func sendEvent(_ name: String, body: [String : Any]) {
    RNEventEmitter.emitter.sendEvent(withName: name, body: body)
  }

然后从任何地方sendEvent("onFinished",“本机进程已经完成!”)

当然,你也需要在反应本土方面接受这一点。我也可以向你展示你是如何做到的;

App.js

代码语言:javascript
复制
import {NativeModules, NativeEventEmitter} from 'react-native';

const {RNEventEmitter} = NativeModules;

const eventEmitter = new NativeEventEmitter(RNEventEmitter);

  eventEmitter.addListener('onFinished', res =>
    console.log(res.data),
  );
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68712655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档