- 獲得當(dāng)前 Component 所屬 ViewController 的辦法(這是后續(xù)各個操作的基礎(chǔ))
- 創(chuàng)建或找到一個現(xiàn)成的 BridgeModule 類
- 在該 BridgeModule 類的 .m 文件中,確保包含
#import "UIView+React.h"- 在 @implementation 中,確保包含
@synthesize bridge = _bridge;- 在 @implementation 中,RCT_EXPORT_METHOD 一個 Bridge 方法
RCT_EXPORT_METHOD( sometingToDoWithTheViewControllerOfTheComponent:(nonnull NSNumber *)reactTag // Component 對象的 reactTag resolver:(RCTPromiseResolveBlock)resolve // 這行 rejecter:(RCTPromiseRejectBlock)reject // 和這行是可選的,如果需要在執(zhí)行完畢后給 JavaScript 通知的話,就帶上 ) { // 實(shí)現(xiàn)后文詳述 }- 在 Bridge 方法中,通過如下代碼取得 reactTag 對應(yīng)的 view,并基于該 view 取得它所對應(yīng)的 viewController
RCTUIManager *uiManager = _bridge.uiManager; dispatch_async(uiManager.methodQueue, ^{ [uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) { UIView *view = viewRegistry[reactTag]; UIViewController *viewController = (UIViewController *)view.reactViewController; // It's now ok to do something with the viewController // which is in charge of the component. } } - 導(dǎo)航到其它 ViewController 的辦法
- 基于上述辦法取到當(dāng)前 Component 所屬的 ViewController
- 通過如下代碼取得它所屬的 navigationController,調(diào)用它的 pushViewController 或 presentViewController 方法即可
[viewController.navigationController pushViewController:anotherViewController animated:YES]; // 跳轉(zhuǎn) [viewController.navigationController presentViewController:anotherViewController animated:YES completion:^{}] ;// 彈出- 完整代碼如下:
RCT_EXPORT_METHOD ( pushViewControllerXYZ:(nonnull NSNumber *)reactTag resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject ) { RCTUIManager *uiManager = _bridge.uiManager; dispatch_async(uiManager.methodQueue, ^{ [uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) { UIView *view = viewRegistry[reactTag]; UIViewController *viewController = (UIViewController *)view.reactViewController; [viewController pushViewController:[ViewControllerXYZ new] animated:YES]; resolve(nil); } } }RCT_EXPORT_METHOD ( presentViewControllerXYZ:(nonnull NSNumber *)reactTag resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject ) { RCTUIManager *uiManager = _bridge.uiManager; dispatch_async(uiManager.methodQueue, ^{ [uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) { UIView *view = viewRegistry[reactTag]; UIViewController *viewController = (UIViewController *)view.reactViewController; [viewController presentViewController:[ViewControllerXYZ new] animated:YES completion:^{}]; resolve(nil); } } } - 更新當(dāng)前 ViewController 的 navigationItem 屬性的辦法
- 基于上述辦法取到當(dāng)前 Component 所屬的 ViewController
- 通過如下代碼取得它對應(yīng)的 navigationItem,然后各個屬性隨便設(shè)
viewController.navigationItem.title = @"Hello"; viewController.navigationItem.prompt = @"Aloha";- 如果希望設(shè)置 navigationItem 的 titleView 為某個 React Native Component:
RCT_EXPORT_METHOD ( setTitleView:(nonnull NSNumber *)reactTag props:(NSDictionary *)props resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject ) { UIView *titleView = [[RCTRootView alloc] initWithBridge:_bridge moduleName:[props objectForKey:@"moduleName"] initialProperties:[props objectForKey:@"initialProperties"]]; viewController.navigationItem.titleView = titleView; }- 如果希望設(shè)置 navigationItem 的 left、right、back 按鈕:
- 以 React Native 為 view 的通用 ViewController 的實(shí)現(xiàn)辦法
- ~
[React Native] 在 iOS 中,關(guān)于 ViewController 的二三事
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- { 11、核心動畫 需要簽協(xié)議,但是系統(tǒng)幫簽好 一、CABasicAnimation 1、創(chuàng)建基礎(chǔ)動畫對象 CAB...
- 本文將講述下在原生和React Native之間的通信方式。方式和邏輯綜合了自己的思維方式,主要參考了React ...
- 第2章 史上最變態(tài)嬰兒 “嘿嘿!”黑心道士我抽著煙,帶著對毀滅世界的無盡美好期待,慢悠悠地拽進(jìn)了嬰兒房。 走進(jìn)嬰兒...