最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解iOS 輕松獲取當(dāng)前控制器的正確方式

 更新時(shí)間:2019年12月22日 11:59:31   作者:JerseyBro  
這篇文章主要介紹了詳解iOS 輕松獲取當(dāng)前控制器的正確方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

背景

在開發(fā)過程中,經(jīng)常需要獲取當(dāng)前 window, rootViewController, 以及當(dāng)前正在顯示的 visibleController 的需求. 如果 .m 實(shí)現(xiàn)不是在當(dāng)前視圖情況下, 我們需要快速的獲取到當(dāng)前控制器, 這種情況就需要先做好一層封裝,我一般是通過 UIViewController 寫的一個(gè) Category 來實(shí)現(xiàn), 實(shí)現(xiàn)起來也非常簡單, 只需要我們對 控制器幾個(gè)方法掌握便可。

獲取根控制器

+ (UIViewController *)jsd_getRootViewController{

  UIWindow* window = [[[UIApplication sharedApplication] delegate] window];
  NSAssert(window, @"The window is empty");
  return window.rootViewController;
}

這里很簡單, 通過單例獲取到當(dāng)前 UIApplication 的 delegate 在通過 window 即可輕松拿到 rootViewController。

獲取當(dāng)前頁面控制器

+ (UIViewController *)jsd_findVisibleViewController {
  
  UIViewController* currentViewController = [self jsd_rootViewController];

  BOOL runLoopFind = YES;
  while (runLoopFind) {
    if (currentViewController.presentedViewController) {
      currentViewController = currentViewController.presentedViewController;
    } else {
      if ([currentViewController isKindOfClass:[UINavigationController class]]) {
        currentViewController = ((UINavigationController *)currentViewController).visibleViewController;
      } else if ([currentViewController isKindOfClass:[UITabBarController class]]) {
        currentViewController = ((UITabBarController* )currentViewController).selectedViewController;
      } else if ([currentViewController isKindOfClass:[UISplitViewController class]]) { // 當(dāng)需要兼容 Ipad 時(shí)
        currentViewController = currentViewController.presentingViewController;
      } else {
        if (currentViewController.presentingViewController) {
          currentViewController = currentViewController.presentingViewController;
        } else {
          return currentViewController;
        }
      }
    }
  }
  
  return currentViewController;
}

這里講一下實(shí)現(xiàn)思路, 我們想要與控制器無耦合的情況下, 想要直接獲取到當(dāng)前控制器, 基本都是通過 rootViewController 來查找的, 通過上面的方法拿到  rootViewControoler 之后, 我們先看  presentedViewController , 因?yàn)榭刂破鞒尸F(xiàn)出來的方式有 push 與 present, 我們先查看它是否是 present 出來的, 如果是則通過此屬性能找到 present 出來的當(dāng)前控制器, 然后在檢查是否屬于  UINavigationControler 或  UITabBarController ,如果是則通過查找其子控制器里面最頂層或者其正在選擇的控制器。 最后在判斷當(dāng)前控制器是否有子控制器的情況, 如果有則取其子控制器最頂層, 否則當(dāng)前控制器就是其本身。

這里主要是查找當(dāng)前 應(yīng)用程序基于 UITabBarController 和 UINavigationControler 下管理的視圖控制器, 如果還有其他控制器則需要添加 if 條件來進(jìn)行判斷。

方法二: 當(dāng)我們有正在呈現(xiàn)的視圖控制器子 View 時(shí), 可通過屬性 nextResponder 遞歸查找

+ (nullable UIViewController *)findBelongViewControllerForView:(UIView *)view {
  UIResponder *responder = view;
  while ((responder = [responder nextResponder]))
    if ([responder isKindOfClass: [UIViewController class]]) {
      return (UIViewController *)responder;
    }
  return nil;
}

presentedViewController

Apple 文檔 presentedViewControlle

通過此方法可以查找到通過 presented 模態(tài)方式(顯示與隱士) 方式推出的當(dāng)前控制器。 例如: AViewController --> BViewController 通過模態(tài)方式推出. 則使用 AViewController.presentedViewController 能獲取到 BViewController。

presentingViewController

Apple 文檔

通過此方法可以查找到通過 presented 模態(tài)方式(顯示與隱士) 方式推出當(dāng)前控制器的上層控制器。 例如: AViewController --> BViewController 通過模態(tài)方式推出. 則使用 BViewController.presentingViewController 能獲取到 AViewController。

modalViewController

查看文檔發(fā)現(xiàn)此方法已在 iOS 6 后被棄用, 官方推薦直接使用 presentedViewController 替代即可.

參考資料與Dome

Dome: 輕松獲取當(dāng)前控制器

UIViewController的presentedViewController,presentingViewController和parentViewController三個(gè)屬性

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Xcode8下iOS10常見報(bào)錯(cuò)閃退,字體適配和編譯不過的問題及解決方案

    Xcode8下iOS10常見報(bào)錯(cuò)閃退,字體適配和編譯不過的問題及解決方案

    蘋果推送了iOS10,好多朋友迅速即將系統(tǒng)升級了ios10,然后遇到好多問題。下面小編給針對遇到的問題給大家介紹解決方法,希望對大家有所幫助,感興趣的朋友可以參考下
    2016-09-09
  • Unity移動(dòng)端的復(fù)制要這么寫示例代碼

    Unity移動(dòng)端的復(fù)制要這么寫示例代碼

    這篇文章主要給大家介紹了關(guān)于Unity移動(dòng)端的復(fù)制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • 解決ios手機(jī)中input輸入框光標(biāo)過長的問題

    解決ios手機(jī)中input輸入框光標(biāo)過長的問題

    在項(xiàng)目中做移動(dòng)端頁面,發(fā)現(xiàn)IOS 的光標(biāo)大小很大,和安卓的完全不一樣,怎么來調(diào)整大小呢?下面小編給大家?guī)砹薸os手機(jī)中input輸入框光標(biāo)過長問題的解決方法,一起看看吧
    2018-08-08
  • IOS打開照相機(jī)與本地相冊選擇圖片實(shí)例詳解

    IOS打開照相機(jī)與本地相冊選擇圖片實(shí)例詳解

    這篇文章主要介紹了IOS打開照相機(jī)與本地相冊選擇圖片實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • IOS中無限滾動(dòng)Scrollview效果

    IOS中無限滾動(dòng)Scrollview效果

    這篇文章主要為大家詳細(xì)介紹了IOS中無限滾動(dòng)Scrollview效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-02-02
  • iOS開發(fā)————詳解適配iOS10問題

    iOS開發(fā)————詳解適配iOS10問題

    ios10已經(jīng)推出一段時(shí)間了,這篇文章主要介紹了iOS開發(fā)————詳解適配iOS10,有興趣的可以了解一下。
    2016-12-12
  • iOS 8使用UIBlurEffect實(shí)現(xiàn)毛玻璃特效

    iOS 8使用UIBlurEffect實(shí)現(xiàn)毛玻璃特效

    這篇文章主要為大家詳細(xì)介紹了iOS 8使用UIBlurEffect類和UIVisualEffectView類實(shí)現(xiàn)毛玻璃特效,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 簡單談?wù)刢/c++中#import、#include和@class的區(qū)別

    簡單談?wù)刢/c++中#import、#include和@class的區(qū)別

    對于#import,我想做過iOS開發(fā)的人應(yīng)該都不陌生。在開發(fā)過程中,當(dāng)我們需要聲明某一個(gè)類時(shí),都需要去引用。而#imclude的話,在我們學(xué)習(xí)C時(shí)就已經(jīng)知道了,他的作用也是引用聲明的意思。在表面上他們的作用似乎都是一樣的。但是在具體功能實(shí)現(xiàn)方式上,還是有著很大的區(qū)別。
    2018-01-01
  • iOS?RN啟動(dòng)中管理Native?Module詳解

    iOS?RN啟動(dòng)中管理Native?Module詳解

    這篇文章主要為大家介紹了iOS?RN啟動(dòng)中?Native?Module?是如何被管理的,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • iOS生成圖片數(shù)字字母驗(yàn)證效果

    iOS生成圖片數(shù)字字母驗(yàn)證效果

    這篇文章主要為大家詳細(xì)介紹了iOS生成圖片數(shù)字字母驗(yàn)證效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11

最新評論

乌鲁木齐市| 禹城市| 汝城县| 南和县| 大田县| 抚顺县| 大邑县| 同德县| 徐水县| 龙州县| 婺源县| 怀柔区| 库车县| 宁夏| 包头市| 曲松县| 敦煌市| 纳雍县| 融水| 南乐县| 肇源县| 白朗县| 扶沟县| 沧州市| 衡阳县| 泽库县| 北安市| 桐乡市| 嘉兴市| 浮山县| 正镶白旗| 织金县| 富源县| 镇巴县| 阿拉尔市| 密山市| 乐亭县| 阿拉善盟| 木兰县| 夏河县| 保康县|