博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 原生模块 给 Javascript(ReactNative) 发送事件 (通知监听)
阅读量:4086 次
发布时间:2019-05-25

本文共 2700 字,大约阅读时间需要 9 分钟。

官方中文文档是这样描述的:
http://www.cnblogs.com/zhangyang17/p/6929303.html?utm_source=tuicool&utm_medium=referral
 

 

就给我们这几句话 就打发我们了。

按照上面的写法,根本不知道 
- (void)calendarEventReminderReceived:(NSNotification *)notification 方法  什么时候去调用。
 
但是我们根据iOS知识,知道想要发送通知,肯定要先监听通知。
 
所以我们要
保证RN组件 先监听事件通知,在去原生组件发送事件通知
 
原生组件:
EventEmitterManager.h
#import 
#import
@interface EventEmitterManager : RCTEventEmitter
@end

EventEmitterManager.m

#import "EventEmitterManager.h"#import 
#import
NSString *const kEventEmitterManagerEvent = @"EventEmitterManagerEvent";@implementation EventEmitterManager//@synthesize bridge = _bridge;RCT_EXPORT_MODULE();// 等 RN组件 监听事件通知后 在发送事件通知RCT_EXPORT_METHOD(postNotificationEvent:(NSString *)name){ RCTLogInfo(@"postNotificationEvent->:%@",name); [self sendEventWithName:kEventEmitterManagerEvent body:name];}- (NSDictionary
*)constantsToExport { return @{ @"EventEmitterManagerEvent": kEventEmitterManagerEvent, };}- (NSArray
*)supportedEvents { return @[kEventEmitterManagerEvent,];}@end
RN组件:
componentWillMount(){        // 拿到原生模块        var EventEmitterManager = NativeModules.EventEmitterManager;        // 创建自定义事件接口        const eventEmitterManagerEmitter = new NativeEventEmitter(EventEmitterManager);        // 导出常量        const EventEmitterManagerEvent   = EventEmitterManager.EventEmitterManagerEvent;        // 监听原生 发送的通知        this.listener = eventEmitterManagerEmitter.addListener(            EventEmitterManagerEvent,            (data) => Alert.alert('来了 来了 ->'+ data)        );    }    componentDidMount() {        var EventEmitterManager = NativeModules.EventEmitterManager;        // 调用原生模块 postNotificationEvent方法        EventEmitterManager.postNotificationEvent('张杨事件传递');    }    componentWillUnmount(){        this.listener.remove();    }
 
可以看到 
componentWillMount 中 先监听通知 
componentDidMount 中 再调用原生模块方法去发送通知  
componentWillUnmount 中 再去移除监听
 
还有一个小Tip:
我在写demo时候 不想一直 在 index.ios.js 中 去添加其他组件,然后RCTRootView去实例化。
所以我就投机一下,
 
- (IBAction)postNotification:(id)sender {    _jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"src/PostNotification" fallbackResource:nil];  _rootView = [[RCTRootView alloc] initWithBundleURL : _jsCodeLocation                                  moduleName        : @"PostNotification"                                  initialProperties : nil                                  launchOptions     : nil];  UIViewController *vc = [[UIViewController alloc] init];  vc.view = _rootView;   [self.navigationController pushViewController:vc animated:YES];}
bundleRoot 写路径  
src/PostNotification    
你可能感兴趣的文章
String、StringBuilder和StringBuffer
查看>>
Java反射基础
查看>>
因代码规范导致枪击案,这样黑程序员不太好吧 。
查看>>
Android事件分发机制
查看>>
Android Clean 架构
查看>>
Android 音视频学习资源汇总
查看>>
我的 2018 年终总结
查看>>
JVM 中如何判断对象可以被回收
查看>>
JVM 内存结构
查看>>
JVM 中的内存溢出
查看>>
maven的使用
查看>>
SpringMVC配置
查看>>
Java反射机制:从对象获取类的所有方法信息
查看>>
Java反射机制:获取成员变量和构造函数的信息
查看>>
Java反射机制:方法反射的基本操作
查看>>
Html和CSS的关系
查看>>
css样式分类
查看>>
Bootstrap:基本模板
查看>>
Bootstrap:常用的排版风格
查看>>
JavaScrit常用的简单交互
查看>>