在iOS中創(chuàng)建React-Native頁面沃斤,并跳轉(zhuǎn)到原生頁面

需求:

上一篇文章中弓摘,我們講到怎么在iOS原生里面集成React-Native焚鹊,這篇文章將講解怎么在原生中創(chuàng)建React-Native頁面,并且從RN頁面跳轉(zhuǎn)到原生頁面。
我將項目更新到了github上末患,里面有很多我自己的理解研叫,希望可以幫到各位讀者react-native-learn

如果遇到什么問題可以在評論區(qū)回復(fù),或者加QQ群397885169討論

創(chuàng)建:

我們將在項目中創(chuàng)建一個View璧针,用來展示React-Native頁面

  • 在原生ios應(yīng)用添加容器視圖 我們在工程文件下創(chuàng)建一個名為ReactView的UIView文件: React-iOS目錄 -> 右鍵 -> New File -> Cocoa Touch Class -> ReactView嚷炉,
ReactView.png
  • 修改ReactView.m
#import "ReactView.h"
#import <RCTRootView.h>
@implementation ReactView

- (instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        NSString * strUrl = @"http://localhost:8081/index.ios.bundle?platform=ios&dev=true";
        NSURL * jsCodeLocation = [NSURL URLWithString:strUrl];
        // 這里的moduleName一定要和下面的index.ios.js里面的注冊一樣
        RCTRootView * rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
                                                             moduleName:@"ReactiOS"
                                                      initialProperties:nil
                                                          launchOptions:nil];
        
        [self addSubview:rootView];
        
        rootView.frame = self.bounds;
    }
    return self;
}
@end

ReactView.m中通過http://localhost:8081/index.ios.bundle?platform=ios&dev=true加載bundle文件,由RCTRootView解析轉(zhuǎn)化原生的UIView探橱,然后通過initWithFrame將frame暴露出去申屹。

  • 在原生ios應(yīng)用中引用ReactView 上面我們創(chuàng)建了一個ReactView,打開ViewController.m隧膏,在viewDidLoad方法中應(yīng)用我們的ReactView哗讥。
#import "ViewController.h"
#import "ReactView.h"
@interface ViewController ()
@end
@implementation ViewController
 - (void)viewDidLoad {
      [super viewDidLoad];
      ReactView * reactView = [[ReactView alloc] initWithFrame:CGRectMake(0,64,CGRectGetWidth(self.view.bounds), 100)];
    
      [self.view addSubview:reactView];
  }

這樣,我們的項目就創(chuàng)建好了胞枕。接下來就是運行項目了

運行:

如果做過reactNative開發(fā)杆煞,都知道每次運行項目之前都需要啟動開發(fā)服務(wù)器,只不過之前是X-Code自動啟動腐泻,現(xiàn)在需要手動開啟决乎。
進(jìn)入reactnative根目錄(我是放在桌面上了,最簡單的方式就是直接拖拽)派桩,然后啟動$ react-native start

開啟服務(wù)器.png

設(shè)置允許Http請求:

直接運行項目會報Could not connect to development server錯誤
解決方式:打開info.plist文件构诚,添加下面配置即可:

<key>NSAppTransportSecurity</key>  
<dict>  
    <key>NSExceptionDomains</key>
    <dict>
        <key>localhost</key>
        <dict>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict> 

運行ios項目:

通過Xcode點擊項目或者command + R運行項目,如果順利的話窄坦,就會看到成功運行的界面:

運行成功.png

當(dāng)看到上面的圖片唤反,就代表大功告成,這樣就掌握了在iOS原生中集成React-Native方法了~

跳轉(zhuǎn):

接下來鸭津,我們講講怎么從上面創(chuàng)建的RN頁面點擊Hello World !跳轉(zhuǎn)回原生頁面
ps:官方文檔對于iOS和原生的交互寫了好多彤侍,不知道你們看懂沒,反正我是一頭霧水逆趋。
還是直接上代碼:

  • 在OC中的代碼
    ?1. 在XCode 中的AppDelegate.h中創(chuàng)建原生的UINavigationController,這樣在其他頁面可以用過AppDelegate這個單例來調(diào)用到導(dǎo)航進(jìn)行跳轉(zhuǎn)操作
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
// 創(chuàng)建一個原生的導(dǎo)航條
@property (nonatomic, strong) UINavigationController *nav;
@end

2.在AppDelegate.m中使導(dǎo)航條成為跟控制器

#import "AppDelegate.h"
#import "ViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor whiteColor];    
    ViewController *view = [[ViewController alloc]init];
    // 初始化Nav
    _nav = [[UINavigationController alloc]initWithRootViewController:view];
    // 將Nav設(shè)置為根視圖
    self.window.rootViewController = _nav;    
    [self.window makeKeyAndVisible];    
    return YES;
}

3.新建 RCTModules 類盏阶,繼承 NSObject 封裝一個方法使用“通知”進(jìn)行消息的傳送從而實現(xiàn)頁面的跳轉(zhuǎn)

RCTModules.h

#import <Foundation/Foundation.h>
#import "RCTBridgeModule.h"

@interface RTModule : NSObject<RCTBridgeModule>
@end

RCTModules.m

#import "RTModule.h"
#import "RCTBridge.h"

@implementation RTModule

RCT_EXPORT_MODULE(RTModule)
//RN跳轉(zhuǎn)原生界面
RCT_EXPORT_METHOD(RNOpenOneVC:(NSString *)msg){
    
    NSLog(@"RN傳入原生界面的數(shù)據(jù)為:%@",msg);
    //主要這里必須使用主線程發(fā)送,不然有可能失效
    dispatch_async(dispatch_get_main_queue(), ^{
        [[NSNotificationCenter defaultCenter]postNotificationName:@"RNOpenOneVC" object:nil];
    });
}

@end

4.接下來在ViewController.m中添加通知的方法

#import "ViewController.h"
#import "ReactView.h"
#import "AppDelegate.h"
#import "OneViewController.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.navigationItem.title = @"我是包含RN的原生頁面喲~";

    ReactView * reactView = [[ReactView alloc] initWithFrame:CGRectMake(0, 64, CGRectGetWidth(self.view.bounds), 100)];
    
    [self.view addSubview:reactView];
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doPushNotification:) name:@"RNOpenOneVC" object:nil];

}

- (void)doPushNotification:(NSNotification *)notification{
    NSLog(@"成功收到===>通知");
    OneViewController *one = [[OneViewController alloc]init];
    
    AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    
    [app.nav pushViewController:one animated:YES];
    
    //注意不能在這里移除通知否則pus進(jìn)去后有pop失效
}

@end

5.接下來就要創(chuàng)建我們將要跳轉(zhuǎn)的頁面啦。創(chuàng)建OneViewController繼承于UIViewController

OC中的項目結(jié)構(gòu).png
  • 在index.ios.js中的代碼
import React, { Component } from 'react';
import {  
    AppRegistry, 
    StyleSheet,  
    Text,  
    View, 
    TouchableOpacity,  
    NativeModules
} from 'react-native';
var RNModules = NativeModules.RTModule;
class ReactiOS extends Component {
    render() {   
        return (      
            <View style={styles.container}>
            <TouchableOpacity
               onPress={()=>RNModules.RNOpenOneVC('測試')}>
                   <Text>Hello World!</Text>
            </TouchableOpacity>      </View>    );  
    }
}
const styles = StyleSheet.create({ 
  container: {
    backgroundColor : 'red',
    height:100,
    flexDirection : 'row'
    },
});
AppRegistry.registerComponent('ReactiOS', () => ReactiOS);

運行:

上面的那些步驟寫完闻书,開啟服務(wù)器就應(yīng)該能看到下面這張圖名斟,點擊helloWorld,跳轉(zhuǎn)到下一個頁面啦~

控制臺打印.png
gif5新文件.gif

小結(jié):

通過React-Native與iOS原生的集成步驟和這篇文章魄眉,應(yīng)該能夠?qū)W會怎么在項目中集成React-Native項目了砰盐。當(dāng)然,你如果想在同一個RN頁面中跳轉(zhuǎn)多個頁面坑律,可以注冊不同的通知岩梳,在RN頁面點擊的時候跳轉(zhuǎn)就可以了。在我的demo中會有這個例子。
ps:我還是很推薦用Cocoapods集成React-Native開發(fā)環(huán)境的冀值,因為我手動集成的時候遇到了好多坑,如果在開發(fā)中遇到什么其他問題也物,歡迎評論。
/(ㄒoㄒ)/~~ 不知道怎么往github上傳列疗。滑蚯。。所以打包成了百度云

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抵栈,一起剝皮案震驚了整個濱河市告材,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌古劲,老刑警劉巖创葡,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異绢慢,居然都是意外死亡,警方通過查閱死者的電腦和手機洛波,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門胰舆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蹬挤,你說我怎么就攤上這事缚窿。” “怎么了焰扳?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵倦零,是天一觀的道長。 經(jīng)常有香客問我吨悍,道長扫茅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任育瓜,我火速辦了婚禮葫隙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘躏仇。我一直安慰自己恋脚,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布焰手。 她就那樣靜靜地躺著糟描,像睡著了一般。 火紅的嫁衣襯著肌膚如雪书妻。 梳的紋絲不亂的頭發(fā)上船响,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音,去河邊找鬼灿意。 笑死估灿,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缤剧。 我是一名探鬼主播馅袁,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼荒辕!你這毒婦竟也來了汗销?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤抵窒,失蹤者是張志新(化名)和其女友劉穎弛针,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體李皇,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡削茁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了掉房。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茧跋。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖卓囚,靈堂內(nèi)的尸體忽然破棺而出瘾杭,到底是詐尸還是另有隱情,我是刑警寧澤哪亿,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布粥烁,位于F島的核電站,受9級特大地震影響蝇棉,放射性物質(zhì)發(fā)生泄漏讨阻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一银萍、第九天 我趴在偏房一處隱蔽的房頂上張望变勇。 院中可真熱鬧,春花似錦贴唇、人聲如沸搀绣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至晴叨,卻和暖如春瓶您,著一層夾襖步出監(jiān)牢的瞬間麻捻,已是汗流浹背纲仍。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贸毕,地道東北人郑叠。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像明棍,于是被迫代替她去往敵國和親乡革。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容