React-Native RCTEventEmitter (OC

作者: 我是C | 来源:发表于2017-06-07 16:57 被阅读1450次

    需要从iOS向RN 发送一个通知,这时就会用到RCTEventEmitter.

    我直接把代码贴出来:

    //.h
    + (void)postNotiToReactNative:(NSString *)type args:(id)args;
    
    //.m
    RCT_EXPORT_MODULE();
    
    - (NSArray<NSString *> *)supportedEvents {
        return @[@"SpotifyHelper"]; //这里返回的将是你要发送的消息名的数组。
    }
    - (void)startObserving
    {
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(emitEventInternal:)
                                                     name:@"event-emitted"
                                                   object:nil];
    }
    - (void)stopObserving
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    
    - (void)emitEventInternal:(NSNotification *)notification
    {
        [self sendEventWithName:@"SpotifyHelper"
                           body:notification.object];
    }
    
    + (void)postNotiToReactNative:(NSString *)type args:(id)args{
        NSMutableDictionary *dic = [NSMutableDictionary dictionary];
        dic[@"type"] = type;
        dic[@"args"] = args;
        [[NSNotificationCenter defaultCenter] postNotificationName:@"event-emitted" object:dic];
    }
    

    注意

    一旦RCT_EXPORT_MODULE();声明该类是EXPORT_MODULE,那么该类的实例已经创建好了.如果你在其他地方创建这个类的实例(alloc 或 new),会导致,RN不能正确识别该类的实例.

    对应的 RN 代码:

    'use strict';
    
    import React,{Component} from 'react';
    import {
      ·
      ·
      ·
      NativeModules,
      NativeEventEmitter,
    } from 'react-native';
    
    import Main from './app/HJMain';
    
    var nativeBridge = NativeModules.RNIOSExportJsToReact;//你的类名
    const NativeModule = new NativeEventEmitter(nativeBridge);
    
    export default class Haojia extends React.Component {
    
      render() {
        return (
            <Main />
        );
      }
    
      componentDidMount(){
        this.subscription = NativeModule.addListener('SpotifyHelper',(data)=>this._getNotice(data));
      }
    
      _getNotice (body) {//body 看你传什么
          //一系列操作
      }
    
      componentWillUnmount() {
        //删除监听
        this.subscription.remove()
      }
    
    }
    

    在OC需要的地方加上RNIOSExportJsToReact(参数)就可以调用RN的方法了

    以上是OC 调用 RN方法的代码,完毕!

    相关文章

      网友评论

      • JsLin_:'RCTEventEmitter.h' file not found
      • 简翦儋箪:楼主,我想请问一下, @interface CalendarManager:RCTEventEmitter<RCTBridgeModule> 这里面的CalendarManager创建的时候是集成自NSObject的么。如果是集成自NSObject,CalendarManager:NSObject<RCTBridgeModule> 这里面的NSObject换成RCTEventEmitter么,为啥我换掉之后,运行项目报错,求指教
      • 红尘安乐_si:我按你的方法做的东西 RN界面还是一直收不到数据
        V会飞的蜗牛:小伙子,用个单列重新保存一下数据,再传过去就有了
      • 贺彦文:我艹,找了一天半,终于解决了.楼主这个解决方案才是正解.看了这么多文章,发现这块儿RN官方也是变来变去,搞得很多人都一头雾水.
        红尘安乐_si:@我是C 按这样的做法 我在RN一直接收不到数据 你遇到过?
        我是C:解决问题就好:smile:
      • keyuan0214:感谢!解决了我从在iOS代理方法中想rn中的js传值的问题。赞!
      • _moses:您好,您知道这个崩溃怎么解决吗?
        ‘bridge is not set. This is probably because you've explicitly synthesized the bridge in ChatEventEmitter, even though it's inherited from RCTEventEmitter.’
        _moses:@我是滕先生 嗯,谢谢,你说的很对,我已经解决了,我还总结了一篇文章贴出来了:smile:
        我是滕先生:需要通知来调用,不能直接实例调用方法
        我是滕先生:一旦RCT_EXPORT_MODULE();声明该类是EXPORT_MODULE,那么该类的实例已经创建好了.如果你在其他地方创建这个类的实例(alloc 或 new),会导致,RN不能正确识别该类的实例.
      • 无星灬:请问有项目地址吗,我在rn中监听不到事件,想学习一下。
        26b0e5262789:componentDidMount(){
        this.subscription = NativeModule.addListener('SpotifyHelper',(data)=>this._getNotice(data));
        } 这个this.subscription 怎么来的,我的报 :Sending `SpotifyHelper` with no listeners registered. 什么问题呢?谢谢!
        无星灬:@我是C 我今天解决了。谢谢你
        我是C:没有demo,我都是从项目里拉出来的,你可以贴出代码,帮你看看

      本文标题:React-Native RCTEventEmitter (OC

      本文链接:https://www.haomeiwen.com/subject/ufkafxtx.html