React Native 错误 No visible @interface for 'MyModule' declares the selector 'sendEventWithName:body:'

React Native 2020-03-27 阅读 229 评论 0

问题描述

在 iOS 项目使用 Objective C 自定义一个 native 原生模块,使用 sendEventWithName 发送一个事件到 Javascript 模块。

// MyModule.h
#import <React/RCTBridgeModule.h>

@interface MyModule : NSObject <RCTBridgeModule>

@end
// MyModule.m
#import "MyModule.h"

@implementation MyModule

RCT_EXPORT_MODULE();

- (NSArray<NSString *> *)supportedEvents
{
  return @[@"EventReminder"];
}

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

@end

Xcode报了一个错误。

No visible @interface for 'MyModule' declares the selector 'sendEventWithName:body:'

解决方法

sendEventWithNameRCTEventEmitter 类的方法,MyModule.h 需要继承RCTEventEmitter ,而不是 NSObject

// MyModule.h
#import <React/RCTBridgeModule.h>
#import <React/RCTEventEmitter.h>

@interface MyModule : RCTEventEmitter <RCTBridgeModule>

@end
最后更新 2020-03-27
MIP.watch('startSearch', function (newVal, oldVal) { if(newVal) { var keyword = MIP.getData('keyword'); console.log(keyword); // 替换当前历史记录,新增 MIP.viewer.open('/s/' + keyword, {replace: true}); setTimeout(function () { MIP.setData({startSearch: false}) }, 1000); } }); MIP.watch('goHome', function (newVal, oldVal) { MIP.viewer.open('/', {replace: false}); });