react-native調(diào)用OC原生

一直想學(xué)學(xué)這一塊東西.但是感覺要對(duì)底層非常了解.
所以一直拖延了下來(lái).
現(xiàn)在有時(shí)間,就簡(jiǎn)單的先傳值開始

首先RN調(diào)用OC

在Xcode 創(chuàng)建一個(gè)類.

image.png

在TestOBJ.h里導(dǎo)入

image.png

這里也需要注意下根據(jù)版本不同,有些同學(xué)會(huì)報(bào)錯(cuò)
你也可以改成

#import "RCTBridgeModule"

引入:#import “RCTBridgeModule.h” 且使用 <RCTBridgeModule> 接口

接下來(lái)
為了實(shí)現(xiàn)RCTBridgeModule協(xié)議,類需要包含RCT_EXPORT_MODULE()宏(這個(gè)宏也可以添加一個(gè)參數(shù)用來(lái)指定在Javascript中訪問(wèn)這個(gè)模塊的名字。如果你不指定,默認(rèn)就會(huì)使用這個(gè)Objective-C類的名字

RCT_EXPORT_MODULE();
 
//橋接到Javascript的方法返回值類型必須是void。React Native的橋接操作是異步的,所以要返回結(jié)果給Javascript,必須通過(guò)回調(diào)或者觸發(fā)事件來(lái)進(jìn)行
RCT_EXPORT_METHOD(j2oFun1:(NSString *)dataString dateNumber:(int)dateNumber)
{
    NSLog(@"js call iOS function j2oFun1\n dataString: %@ |dateNumber :%d",dataString,dateNumber);
}

想要將oc的函數(shù)導(dǎo)出給js進(jìn)行調(diào)用,那么就需要進(jìn)行聲明。聲明通過(guò)RCT_EXPORT_METHOD()宏來(lái)實(shí)現(xiàn):

j2oFun1:函數(shù)名,后續(xù)是兩個(gè)參數(shù),分別是NSString 和 int 類型數(shù)據(jù)。

調(diào)用成功后,我們輸出這兩個(gè)傳來(lái)的值到控制臺(tái)。

下面我們?cè)倏纯碦N JS的代碼

隨便穿件一個(gè)界面,然后寫一個(gè)點(diǎn)擊方法.
這里我就不截圖了.

//將OC注冊(cè)進(jìn)來(lái)的模塊取出
var Jto = require('react-native').NativeModules.TestOBJ;
//在你點(diǎn)擊事件里寫上如下代碼,然后再xcode控制臺(tái)看看是否調(diào)用成功
Jto.j2oFun1('Jonson',22);
image.png

還是比較簡(jiǎn)單的.
后面再看下如何調(diào)用OC 頁(yè)面.有時(shí)間再更新,

下面是RN調(diào)用控iOS跳轉(zhuǎn)控制器

AppDelegate.h

@property (nonatomic,strong)UINavigationController *nav;

AppDelegate.m文件里添加

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  UIViewController *rootViewController = [UIViewController new];
  rootViewController.view = rootView;
//  self.window.rootViewController = rootViewController;



//添加如下2行代碼
  _nav = [[UINavigationController alloc]initWithRootViewController:rootViewController];
  
  self.window.rootViewController = _nav;




  [self.window makeKeyAndVisible];

接下來(lái)創(chuàng)建一個(gè)控制器;
OneController

下面是項(xiàng)目結(jié)構(gòu)圖

image.png

TestOBJ.m文件里添加如下代碼,以前的方法可以不用動(dòng)

//對(duì)了這里說(shuō)明下,這里一定要使用主線程.否則會(huì)不成功
dispatch_async(dispatch_get_main_queue(), ^{
    OneViewController *one = [[OneViewController alloc]init];
    
    AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    
    [app.nav pushViewController:one animated:YES];
  });

下面是RN的代碼了

//繼續(xù)使用上次測(cè)試代碼,發(fā)現(xiàn)可以跳轉(zhuǎn)了.
Jto.j2oFun1('Jonson',22);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容