[React Native] 在 iOS 中,關(guān)于 ViewController 的二三事

  • 獲得當(dāng)前 Component 所屬 ViewController 的辦法(這是后續(xù)各個操作的基礎(chǔ))
    1. 創(chuàng)建或找到一個現(xiàn)成的 BridgeModule 類
    2. 在該 BridgeModule 類的 .m 文件中,確保包含
     #import "UIView+React.h"
    
    1. 在 @implementation 中,確保包含
     @synthesize bridge = _bridge;
    
    1. 在 @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)后文詳述
     }
    
    1. 在 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 的辦法
    1. 基于上述辦法取到當(dāng)前 Component 所屬的 ViewController
    2. 通過如下代碼取得它所屬的 navigationController,調(diào)用它的 pushViewController 或 presentViewController 方法即可
     [viewController.navigationController pushViewController:anotherViewController animated:YES]; // 跳轉(zhuǎn)
     [viewController.navigationController presentViewController:anotherViewController animated:YES completion:^{}] ;// 彈出
    
    1. 完整代碼如下:
     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 屬性的辦法
    1. 基于上述辦法取到當(dāng)前 Component 所屬的 ViewController
    2. 通過如下代碼取得它對應(yīng)的 navigationItem,然后各個屬性隨便設(shè)
     viewController.navigationItem.title = @"Hello";
     viewController.navigationItem.prompt = @"Aloha";
    
    1. 如果希望設(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;
     }
    
    1. 如果希望設(shè)置 navigationItem 的 left、right、back 按鈕:
  • 以 React Native 為 view 的通用 ViewController 的實(shí)現(xiàn)辦法
    1. ~
最后編輯于
?著作權(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ù)。

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

  • { 11、核心動畫 需要簽協(xié)議,但是系統(tǒng)幫簽好 一、CABasicAnimation 1、創(chuàng)建基礎(chǔ)動畫對象 CAB...
    CYC666閱讀 1,702評論 2 4
  • 本文將講述下在原生和React Native之間的通信方式。方式和邏輯綜合了自己的思維方式,主要參考了React ...
    朱_源浩閱讀 28,615評論 25 84
  • 第2章 史上最變態(tài)嬰兒 “嘿嘿!”黑心道士我抽著煙,帶著對毀滅世界的無盡美好期待,慢悠悠地拽進(jìn)了嬰兒房。 走進(jìn)嬰兒...
    要藥藥閱讀 234評論 0 0
  • 看書還得看大師大家的書,深刻透徹。 大師是用最平凡易懂的語言精準(zhǔn)深刻地闡釋深奧的哲學(xué),而很多所謂的暢銷書則是浮夸的...
    我就是我啦閱讀 258評論 0 0
  • 浪矢雜貨店:僻靜的街道上有一家雜貨店,只要寫下煩惱投進(jìn)卷簾門的投信口,第二天就會在店后的牛奶箱里得到回答。這一間時...
    玲秀Lucy閱讀 921評論 3 3

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