• 简单实现RN调用原生方法(IOS)


    在React Native中,一个“原生模块”就是一个实现了“RCTBridgeModule”协议的Objective-C类(个人理解RCTBridgeModule就是react与native之间的桥),下面我们来创建一只猫(cat)

    我们现在iOS根目录下创建一个.h头文件(CreatCat.h) 继承桥梁RCTBridgeModule

    #import <Foundation/Foundation.h>
    #import "RCTBridgeModule.h"
    
    @interface CreatCat : NSObject <RCTBridgeModule>
    
    @end
    

    2 然后我们创建.m文件(CreatCat.m)来实现这个类的一些方法

    //
    //  CreatCat.m
    //  demo
    //
    //  Created by xieyusheng on 2017/11/10.
    //  Copyright © 2017年 Facebook. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import "CreatCat.h"
    
    @implementation CreatCat
    
    RCT_EXPORT_MODULE();
    
    RCT_EXPORT_METHOD(cratCat:(NSString *)name sex:(NSString *)sex age:(int)age)
    {
      NSLog(@"我创建了一只名叫%@的猫,性别%@, 今年%d岁", name, sex, age);
    }
    
    //对外提供调用方法
    RCT_EXPORT_METHOD(addEvent:(NSString *)name location:(NSString *)location){
      NSLog(@"Pretending to create an event %@ at %@", name, location);
    }
    
    //方法3
    RCT_EXPORT_METHOD(whoName:(NSString *)name age:(int)age location:(NSString *)location){
      NSLog(@"可以的%@,年来%d,还有%@",name,age,location);
    }
    
    @end
    

     这里注意的是   RCT_EXPORT_MODULE(); 就是导出模块的意思 一般默认模块名称i就是类名 

    然后我们在实现方法  addEvent等等

    然后在我们就可以在RN的js里面实现了

    /**
     * Sample React Native App
     * https://github.com/facebook/react-native
     * @flow
     */
    
    import React, { Component } from 'react';
    import {
      Platform,
      StyleSheet,
      Text,
      View,
      Touchableopacity
    } from 'react-native';
    //导入
    var cat = require('react-native').NativeModules.CreatCat;
    const instructions = Platform.select({
      ios: 'Press Cmd+R to reload,
    ' +
        'Cmd+D or shake for dev menu',
      android: 'Double tap R on your keyboard to reload,
    ' +
        'Shake or press menu button for dev menu',
    });
    
    export default class App extends Component<{}> {
    //方法执行,
      show(){
        // alert("aa")
        // cat.cratCat('机器猫', '男', 2);
        // cat.addEvent("血雨声","zaijia")
        cat.whoName("xieyusheng",12,"官渡")
      }
      render() {
        return (
          <View style={styles.container}>
            <Text style={styles.welcome} onPress={()=>this.show()}>
              Welcome to React Native!
            </Text>
            <Text style={styles.instructions}>
              To get started, edit App.js
            </Text>
            <Text style={styles.instructions}>
              {instructions}
            </Text>
    
          </View>
        );
      }
    }
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
      },
      welcome: {
        fontSize: 20,
        textAlign: 'center',
        margin: 10,
      },
      instructions: {
        textAlign: 'center',
        color: '#333333',
        marginBottom: 5,
      },
    });
    

     然后在Xcode的控制台上就可以看到打印的结果了,

    当然 这只是第一步 作为js端需要原生传递过来数据 那么久需要回调了 ,这里才用的是Promise格式

    RCT_REMAP_METHOD(findEventsPromise,
                     resolver:(RCTPromiseResolveBlock)resolve
                     rejecter:(RCTPromiseRejectBlock)reject)
    {
      NSArray *events =@[@"张三",@"李四",@"王五",@"赵六"];
      if (events) {
        resolve(events);
      } else {
        NSError *error=[NSError errorWithDomain:@"我是Promise回调错误信息..." code:101 userInfo:nil];
        reject(@"no_events", @"There were no events", error);
      }
    }
    

     js端

    //获取Promise对象处理
      ok(){
        cat.findEventsPromise()
          .then((responseJson) => {
            alert(responseJson)
          })
          .catch((error) => {
            console.error(error);
          });
      }
    

     会弹出原生传递过来的数据了哦。

    以上我们就可以实现RN端和IOS原生端的数据之间的相互传递!

  • 相关阅读:
    C语言 两个跟结构(struct)有关的参数传递问题
    Linux虚拟机 Ubuntu执行sudo apt-get install出现无法解析域名
    损失函数
    决策树(分类树、回归树)
    k近邻(k-NN)算法
    机器学习和深度学习的区别
    无量纲量和有量纲量
    常用激活函数/损失函数/代价函数
    深度学习:激活函数、损失函数、优化函数的区别
    逻辑回归--推导明确,但理论较少
  • 原文地址:https://www.cnblogs.com/allenxieyusheng/p/7815591.html
Copyright © 2020-2023  润新知