iOS开发嵌套ReactNative页面

最近使用ReactNative做项目,有信心今天目标把ReactNative框架掌握,所以自己从每个知识点学习提高自己吧......

步骤如下:

一.创建依赖包文件(package.json):

React Native的植入过程同时需要React和React Native两个node依赖包。我们把具体的依赖包记录在package.json文件中。

  • 如果项目根目录中没有这个文件,那就自己创建一个。
  • 如果为了目录结构的美观,也可以在根目录下创建一个文件夹<这里我没有使用分文件夹,我懒得....当然分文件夹比较好的啦!!>,放置相关的ReactNative文件.

如果自己创建package.json文件,终端操作:

cd 需要放置的目录下(项目的根目录/项目中自己创建的文件夹)
touch package.json

package.json添加以下内容:我这里使用的是0.44

{
  "name": "iOSNestReactNative",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node node_modules/react-native/local-cli/cli.js start"
  },
  "dependencies": {
    "react": "16.0.0-alpha.6",
    "react-native": "0.44.0"
  }
}
二、安装依赖包(node_modules):

使用npm(即node包管理器,Node package manager)来安装React和React Native模块。这些模块会被安装到项目根目录下的node_modules/目录中。

cd 项目的根目录/项目中自己创建的文件夹
npm install

等待执行完毕。项目中会多出一个node_modules文件夹。

三、添加React Native框架(Podfile):

在React和React Native模块成功安装到node_modules目录之后,你就可以开始创建Podfile以便选择所需的组件安装到应用中。

这里需要使用CocoaPods哟...我相信做iOS的应该都有这个吧...哈哈??

## 在iOS原生代码所在的目录中(也就是`.xcodeproj`文件所在的目录)执行:
$ cd 项目的根目录
$ pod init

修改Profile文件:

# 最低适配的版本
platform :ios, "9.0"
use_frameworks!
# target的名字一般与你的项目名字相同
target ‘iOSNestReactNative‘ do

  # ‘node_modules‘目录一般位于根目录中
  # 但是如果你的结构不同,那你就要根据实际路径修改下面的`:path`
#记得此处的路径,如果你有创建一个新的文件夹存放这些文件,前面要加上你文件夹的名字:‘../RNComponent/node_modules/react-native‘,如果没有,直接如下创建即可。
  pod ‘React‘, :path => ‘./node_modules/react-native‘, :subspecs => [
    ‘Core‘,
    ‘RCTText‘,
    ‘RCTNetwork‘,
    ‘RCTWebSocket‘, # 这个模块是用于调试功能的
    # 在这里继续添加你所需要的模块
  ]
 # 如果你的RN版本 >= 0.42.0,请加入下面这行
# 该版本号是package.json中的“dependencies”字典下面的“react-native”后面对应的内容
  pod "Yoga", :path => "./node_modules/react-native/ReactCommon/yoga"
end

创建好了Podfile后,就可以开始安装React Native的pod包了。

执行: pod install即可.

四、代码集成(index.ios.js文件创建):

现在我们已经准备好了所有依赖,可以开始着手修改原生代码来把React Native真正植入到应用中了。

首先创建一个空的index.ios.js文件。一般来说我们把它放置在同上面的package.json的同级目录下.

$ cd 项目的根目录/项目中自己创建的文件夹
$ touch index.ios.js

在index.ios.js文件里写页面代码就可以了哟!!!

‘use strict‘;

import React,{Component} from ‘react‘;
import {
  AppRegistry,
  StyleSheet,
  Text,
  View
} from ‘react-native‘;

class RNHighScores extends React.Component {

  render() {
    // 这里是使用Xcode那边传过来的数据进行构建组件
     var content = this.props[‘NameDict‘].map(
       name=><Text key = {name.name}>{name.name}:{name.value}{‘\n‘}</Text>
     );
    return (
      <View style={styles.container}>
        <Text style={styles.highScoresTitle}>
          跳转过来啦...嘻嘻!
        </Text>
        <Text style={styles.scores}>
          iOS嵌套ReactNative是不是成功了呢??
        </Text>
        <Text style={styles.scores}>
          {content}
        </Text>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: ‘center‘,
    alignItems: ‘center‘,
    backgroundColor: ‘#FFFFFF‘,
  },
  highScoresTitle: {
    fontSize: 20,
    textAlign: ‘center‘,
    margin: 10,
  },
  scores: {
    textAlign: ‘center‘,
    color: ‘#333333‘,
    marginBottom: 5,
  },
});

// 整体js模块的名称
AppRegistry.registerComponent(‘RNHighScores‘, () => RNHighScores);
五、iOS项目中进行初始化配置:

先看一下我的Xcode的目录结构:

1>首先导入RCTRootView.h头文件;

// #import "RCTRootView.h",更新之后,需要导入下面的头文件。
// 官网的评论下方也有说明,否则会提示RCTRootView.h文件不存在。
#import <React/RCTRootView.h>

2>viewDidload中加入代码:

//
//  NextViewController.m
//  iOSNestReactNative
//
//  Created by 思 彭 on 2017/6/16.
//  Copyright ? 2017年 思 彭. All rights reserved.
//

#import "NextViewController.h"
// #import "RCTRootView.h",更新之后,需要导入下面的头文件。
// 官网的评论下方也有说明,否则会提示RCTRootView.h文件不存在。
#import <React/RCTRootView.h>

@interface NextViewController ()

@end

@implementation NextViewController

- (void)viewDidLoad {
    [super viewDidLoad];
//    self.view.backgroundColor = [UIColor grayColor];
//    UIView *view1 = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
//    view1.backgroundColor = [UIColor redColor];
//    [self.view addSubview:view1];

    NSURL *jsCodeLocation = [NSURL
                             URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios"];
    RCTRootView *rootView =
    [[RCTRootView alloc] initWithBundleURL : jsCodeLocation
                         moduleName        : @"RNHighScores"
                         initialProperties :
     @{
       @"NameDict" : @[
               @{
                   @"name" : @"思思",
                   @"value": @"棒棒哒"
                   },
               @{
                   @"name" : @"思思sisi",
                   @"value": @"嘻嘻"
                   }
               ]
       }
                          launchOptions    : nil];
    self.view = rootView;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end
六、启动开发服务器,运行Packager:
# 进入到node_modules文件夹所在的路径
$ cd 项目的根目录/项目中自己创建的文件夹
$ npm start

注意:直接运行项目会报Could not connect to development server错误,需要在项目中配置App Transport Security。(相信这个大家都会的啦~(≧▽≦)/~)
在info.plist中添加http

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
七、在Xcode中运行项目:

运行结果如下:

大功告成...耶耶耶!

Demo地址:https://github.com/PengSiSi/iOSNestReactNativeDemo

时间: 2025-01-18 14:55:26

iOS开发嵌套ReactNative页面的相关文章

IOS开发中滑动页面时NSTimer停止的问题

我们在做倒计时的时候,发现当你手指按着屏幕不放,拖动tableView滑动的时候,写在cell上得倒计时停止倒计时,松开继续倒计时.研究发现就是拖动tableView滑动时,NSTimer停止了. 这其实就是runloop的mode在做怪.runloop可以理解为cocoa下的一种消息循环机制,用来处理各种消息事件,我们在开发 的时候并不需要手动去创建一个runloop,因为框架为我们创建了一个默认的runloop,通过[NSRunloop currentRunloop]我们可以得到一个当前线程

ios开发之启动页面

http://blog.csdn.net/fangzhangsc2006/article/details/8055680 ios启动界面 http://blog.sina.com.cn/s/blog_68f6d53701011b0p.html 关于IOS程序设置启动画面以及图标  设备主要为:IPhone设备 IPhone启动画面以及图标的设置 目前IPhone的分辨率为:320X480.640X960.640X1136. Default.png                     320X

iOS开发之--单个页面禁止右滑返回操作

禁止右滑: if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.interactivePopGestureRecognizer.enabled = NO; } 允许右滑: if ([self.navigationController respondsToSelector:@selector(interac

iOS开发中如何使用百度地图SDK

成功将百度地图sdk为我所用! 现将具体步骤分享如下:xcode5.0.2/BaiduMap_IOSSDK_v2.4.0_All(下载最新版本,与之前有所不同) 首先注册百度帐号,进入百度LBS开放平台,选择IOS开发,进入页面,按照步骤执行: 1.申请key,创建应用,一个应用对应一个Key. 应用名称就填写你要绑定的应用名字,注意:一旦填好不可更改!应用类型选择for mobile:安全码:打开项目,选择 —>就是Bundle Identifier里面的内容:创建成功后会给你一个24位的ke

ios嵌套H5页面,出现的小bug;

ios嵌套H5页面,点击数字时就会弹出打电话的功能:解决方法: 在head标签中添加: <meta name="format-detection" content="telephone=no"> ios嵌套H5页面,只要碰到页面,就会使input获取焦点,调取ios键盘,解决方法:在页面上添加js如下: $("body")[0].addEventListener("touchstart",function(){ d

iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序

iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序 一.plist文件和项目结构图 说明:这是一个嵌套模型的示例 二.代码示例: YYcarsgroup.h文件代码: // // YYcarsgroup.h // 07-汽车展示(高级) // // Created by apple on 14-5-28. // Copyright (c) 2014年 itcase. All rights reserved. // #import <Foundation/Foundation.h> @

学习IOS开发UI篇--UITableView/数据模型嵌套/UITableViewCell/Cell的重用

1.UITableView ================================================== UITableView有两种格式:group和plain 2.UITableView如何展示数据 ================================================== UITableView需要一个数据源(dataSource)来显示数据 凡是遵守UITableViewDataSource协议的OC对象,都可以是UITableView的

iOS 开发之 点击tabbarItem添加是否跳转登录页面判断

iOS 开发之 点击tabbarItem添加是否跳转登录页面判断 项目里面在点击tabbarItem的时候需要判断是否是登录状态,如果未登录直接跳转登录页面,如果已登录则直接进入. 首先设置UITabBarController的代理为appdelegate如下:myTabBar.delegate = self; 然后在interface后面写上代理<UITabBarControllerDelegate> 实现代理里面的- (BOOL)tabBarController:(UITabBarCont

iOS开发实用技巧—项目新特性页面的处理

iOS开发实用技巧篇—项目新特性页面的处理 说明:本文主要说明在项目开发中会涉及到的最最简单的新特性界面(实用UIScrollView展示多张图片的轮播)的处理. 代码示例: 新建一个专门的处理新特性界面的控制器,可以实用代码也可以用xib,在这里实用纯代码方式,创建一个控制器NewfeatureViewController. 头文件代码: 1 // 2 // JMNewfeatureViewController.h 3 // 4 5 #import <UIKit/UIKit.h> 6 7 t