在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,\n' +
'Cmd+D or shake for dev menu',
android: 'Double tap R on your keyboard to reload,\n' +
'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原生端的数据之间的相互传递!

简单实现RN调用原生方法(IOS)的更多相关文章

  1. 【React Native】在原生和React Native间通信(RN调用原生)

    一.从React Native中调用原生方法(原生模块) 原生模块是JS中也可以使用的Objective-C类.一般来说这样的每一个模块的实例都是在每一次通过JS bridge通信时创建的.他们可以导 ...

  2. ReactNative-JS 调用原生方法实例代码(转载)

    第一步首先创建ReactNative 模块类继承ReactContextBaseJavaModule package com.mixture;   import android.content.Con ...

  3. Xamarin.Form怎么调用原生方法

    ---恢复内容开始--- Xamarin.Form怎么调用原生包 今天我想和大家分享的是有关Xamarin如何调用安卓的原生代码,下面的例子以大家可能会经常用到的微信WX方法的调用. 首先我们新建一个 ...

  4. 通过js调用android原生方法

    有时候我们有这样一个需求,监听html中控件的一些事件.例如点击html中某个按钮,跳转到别的activity,复制某段文本. 首先是对webview的设置: myWebView = (WebView ...

  5. uni-app&H5&Android混合开发三 || uni-app调用Android原生方法的三种方式

    前言: 关于H5的调用Android原生方法的方式有很多,在该片文章中我主要简单介绍三种与Android原生方法交互的方式. 一.H5+方法调用android原生方法 H5+ Android开发规范官 ...

  6. java高级用法之:调用本地方法的利器JNA

    目录 简介 JNA初探 JNA加载native lib的流程 本地方法中的结构体参数 总结 简介 JAVA是可以调用本地方法的,官方提供的调用方式叫做JNI,全称叫做java native inter ...

  7. iOS开发--JS调用原生OC篇

    JS调用原生OC篇 方式一(反正我不用) 第一种方式是用JS发起一个假的URL请求,然后利用UIWebView的代理方法拦截这次请求,然后再做相应的处理. 我写了一个简单的HTML网页和一个btn点击 ...

  8. JS调用Android、Ios原生控件

    在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...

  9. JavaScript调用App原生代码(iOS、Android)通用解决方案

    实际场景 场景:现在有一个H5活动页面,上面有一个登陆按钮,要求点击登陆按钮以后,唤出App内部的登录界面,当登录成功以后将用户的手机号返回给H5页面,显示出来.这个场景应该算是比较完整的一次H5中的 ...

随机推荐

  1. ORM some

    1 -- 增 models.表名(类).objects.create(字段1=值,字段2=值) 查 models.表名(类).objects.get(pk = 3) models.表名(类).obje ...

  2. maven项目报错xxx cannot be resolved to a type

    同一个maven项目下的不同模块,无法导入其他模块的类,其他模块的所有类都报xxx cannot be resolved to a type 解决方案(参考): 项目Build Path --> ...

  3. RTP协议全解析(H264码流和PS流)(转)

    源: RTP协议全解析(H264码流和PS流)

  4. redis 缓存锁的实现方法

    1. redis加锁分类 redis能用的的加锁命令分表是INCR.SETNX.SET 2. 第一种锁命令INCR 这种加锁的思路是, key 不存在,那么 key 的值会先被初始化为 0 ,然后再执 ...

  5. JavaScript document open() 方法:打开一个新文档

    <html> <head> <script type="text/javascript"> function createNewDoc() { ...

  6. Python生成目录树代码

    用Python实现类似Windows下的tree命令,获取目录树结构. import os import os.path BRANCH = '├─' LAST_BRANCH = '└─' TAB = ...

  7. springmvc StringHttpMessageConverter 中文乱码的几种解决办法(亲测)

    昨天,将一个原来使用JSR 311作为restful实现的测试系统改成了使用spring mvc,最后测试的时候发现输出的json字符串为乱码,从日志可以看出使用的是StringHttpMessage ...

  8. openstack tap complete

    $ openstack complete > /etc/bash_completion.d/osc.bash_completion re-login and bash

  9. opencv学习之路(11)、图像几何变换

    一.图像缩放 #include<opencv2/opencv.hpp> using namespace cv; void main(){ Mat src=imread("E:// ...

  10. 【专家坐堂Q&A】在 petalinux-config 中选择外部来源时,可将符号链路添加内核来源目录树

    问题描述 作为 petalinux-config 菜单的一部分,现在可以将 Linux 内核指定为外部来源. 如果选择了该选项,可为内核来源目录树添加两个符号链路. 这会带来两个问题: 1. 符号链路 ...