[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 通知的話遥诉,就帶上
     )
     {
       // 實現(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 的實現(xiàn)辦法
    1. ~
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末债朵,一起剝皮案震驚了整個濱河市子眶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌序芦,老刑警劉巖臭杰,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谚中,居然都是意外死亡渴杆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門磁奖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人某筐,你說我怎么就攤上這事比搭。” “怎么了怠苔?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵蟆湖,是天一觀的道長劲室。 經(jīng)常有香客問我,道長谓苟,這世上最難降的妖魔是什么仑撞? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任搀缠,我火速辦了婚禮,結(jié)果婚禮上近迁,老公的妹妹穿的比我還像新娘艺普。我一直安慰自己,他們只是感情好鉴竭,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布歧譬。 她就那樣靜靜地躺著,像睡著了一般搏存。 火紅的嫁衣襯著肌膚如雪瑰步。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天璧眠,我揣著相機與錄音缩焦,去河邊找鬼。 笑死责静,一個胖子當(dāng)著我的面吹牛袁滥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灾螃,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼题翻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了腰鬼?” 一聲冷哼從身側(cè)響起嵌赠,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎熄赡,沒想到半個月后姜挺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡本谜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年初家,在試婚紗的時候發(fā)現(xiàn)自己被綠了偎窘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乌助。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡溜在,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出他托,到底是詐尸還是另有隱情掖肋,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布赏参,位于F島的核電站志笼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏把篓。R本人自食惡果不足惜纫溃,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望韧掩。 院中可真熱鬧紊浩,春花似錦、人聲如沸疗锐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滑臊。三九已至口芍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雇卷,已是汗流浹背鬓椭。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留关划,地道東北人膘融。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像祭玉,于是被迫代替她去往敵國和親氧映。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

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

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