在Swift中将本机发送事件发送到JavaScript

Kos*_*val 6 swift react-native

如何在Swift中将事件发送到JavaScript?

有一些Objc代码示例如何将事件发送到JavaScript,但我需要在swift中做什么?

#import "RCTBridge.h"
#import "RCTEventDispatcher.h"

@implementation CalendarManager

@synthesize bridge = _bridge;

- (void)calendarEventReminderReceived:(NSNotification *)notification
{
  NSString *eventName = notification.userInfo[@"name"];
  [self.bridge.eventDispatcher sendAppEventWithName:@"EventReminder"
                                               body:@{@"name": eventName}];
}

@end
Run Code Online (Sandbox Code Playgroud)

Ste*_*ell 9

我只是想弄清楚自己.这实际上非常简单.继承人我是怎么做到的:

EventTests.m

#import "RCTBridgeModule.h"

@interface RCT_EXTERN_MODULE(EventTests, NSObject)

RCT_EXTERN_METHOD( testEvent:(NSString *)eventName )

@end
Run Code Online (Sandbox Code Playgroud)

EventTests.Swift

import UIKit

@objc( EventTests )
class EventTests: NSObject {
    // Swift doesn't have synthesize - just define the variable
    var bridge: RCTBridge!

    @objc func testEvent( eventName: String ) {
        self.bridge.eventDispatcher.sendAppEventWithName( eventName, body: "Woot!" )
    }
}
Run Code Online (Sandbox Code Playgroud)

MyModule.js

var React      = require( 'react-native' );
var EventTests = require( 'NativeModules' ).EventTests;

var {
    Component,
    NativeAppEventEmitter
} = React;

var testEventName = 'test';

class MyModule extends Component {

    constructor( options ) {
        super( options );

        // Register for our test event
        NativeAppEventEmitter.addListener( testEventName, ( body ) => {
            console.log( body );
        });

        // Call objective c function, which will emit our test event
        EventTests.testEvent( testEventName );
    }
}

module.exports = MyModule;
Run Code Online (Sandbox Code Playgroud)

还要确保在桥接标头中包含一些导入:

#import "RCTBridge.h"
#import "RCTEventDispatcher.h"
Run Code Online (Sandbox Code Playgroud)

  • 使用此实现现在将创建一个警告,说"'不推荐使用'sendAppEventWithName(_:body :)':改为使用子类RCTEventEmitter",我不确定替换是什么,但我认为有一种新方法可以做到这一点. (3认同)