iOS如何获取最顶层ViewController详解

 更新时间:2020年09月07日 08:58:44   作者:早起的年轻人  
这篇文章主要给大家介绍了关于iOS如何获取最顶层ViewController的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1 获取当前屏幕显示的 Viewcontroller

//获取当前屏幕显示的viewcontroller
- (UIViewController *)getCurrentVC
{
 ///下文中有分析
 UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
 UIViewController *currentVC = [self getCurrentVCFrom:rootViewController];
 return currentVC;
}

- (UIViewController *)getCurrentVCFrom:(UIViewController *)rootVC
{
 UIViewController *currentVC;
 if ([rootVC presentedViewController]) {
  // 视图是被presented出来的
  rootVC = [rootVC presentedViewController];
 }

 if ([rootVC isKindOfClass:[UITabBarController class]]) {
  // 根视图为UITabBarController
  currentVC = [self getCurrentVCFrom:[(UITabBarController *)rootVC selectedViewController]]; 
 } else if ([rootVC isKindOfClass:[UINavigationController class]]){
  // 根视图为UINavigationController
  currentVC = [self getCurrentVCFrom:[(UINavigationController *)rootVC visibleViewController]]; 
 } else {
  // 根视图为非导航类 
  currentVC = rootVC;
 }
 
 return currentVC;
}

2 分析

2.1 UIApplication 的简析

UIApplication的核心作用是提供了iOS程序运行期间的控制和协作工作,每一个程序在运行期必须有且仅有一个UIApplication(或则其子类)的一个实例,在程序启动运行时,会在 main 函数中创建一个 UIApplication的单例实例,在代码中可以通过调用[UIApplication sharedApplication]来得到这个单例实例的指针。

2.2  KeyWindow  的简析

在简析 KeyWindow 前我们先来看一看 UIWindow 的概念

UIWindow 是 UIView 的子类,其在 UIView 添加了一些视图层级,管理视图,转发 UIEvent 对象的属性和 Method 等等

在上述实例中,我们通过  [UIApplication sharedApplication] 来获取的 UIApplication 的单例实例对象,然后通过实例对象的 keyWindow再获取到当前活跃的window(或者说是当前显示的主窗口).

KeyWindow 即指在IOS开发中活跃窗口,即能接到键盘和非触摸事件的一个窗口,一次只能有一个KeyWindow,在IOS 开发中,我们可以通过设置UIWindowLevel的数值来设置最前端的窗口为哪个,Level数值越高的窗口越靠前,如果两个窗口的Level等级相同,则我们可以通过makeKeyAndVisible来显示KeyWindow

(void)makeKeyWindow;//让当前UIWindow变成keyWindow(主窗口)
(void)makeKeyAndVisible;//让当前UIWindow变成keyWindow,并显示出来
[UIApplication sharedApplication].windows //获取当前应用的所有的UIWindow
[UIApplication sharedApplication].keyWindow //获取当前应用的主窗口
view.window ///获得某个UIView所在的UIWindow

makeKeyAndVisible 与 makeKeyWindow 

  • makeKeyWindow: 只做了一件事就是使当前窗口成为主要窗口。 当前窗口不一定显示出来
  • makeKeyAndVisible : 做了两件事使当前窗口成为主要窗口并显示当前窗口。如果只想显示的话,我们还可以通过设置其属性hidden为 NO 即可。=

becomeKeyWindow 与 resignKeyWindow

  • becomeKeyWindow: 程序自动调用,用来通知其他窗口 当前容器已被设置为主窗口。 我们不要主动调用此方法, 此方法是系统自动调用的来发通知的,此方法的默认实现不执行任何操作,但子类可以覆盖它并使用它来执行与成为关键窗口相关的任务。
  • resignKeyWindow: 类似becomeKeyWindow, 其是调用以通知窗口它将要注销掉主键窗口的身份.同样的切勿直接调用此方法。

2.3 rootViewController属性

顾名思义:当前窗口的根视图

目前只有UIWindow有rootViewController这个属性,不要跟UINavigationController里面的根视图概念混淆。
UINavigationController其实并没有 rootViewController这个属性!也就没有自带的setter方法。要设置其根视图只能通过如下方法

- (instancetype)initWithRootViewController:(UIViewController *)rootViewController; 

获取 uiwindow的根视图

方式一

AppDelegate *app =(AppDelegate *) [UIApplication sharedApplication].delegate;
UIViewController *rootViewController1 = appdelegate.window.rootViewController;

方式二

UIWindow *window = [UIApplication sharedApplication].keyWindow;
UIViewController *rootViewController2 = window.rootViewController;

需要注意的是:

在方式二中,UIAlertController、UIAlertView、UIActionSheet弹出后,上述这些View 出现生成了一个新的window,加在了界面上面,所以keyWindow就会变成UIAlertControllerShimPresenterWindow这个类

2.4 PresentedViewController 简析

在 ios 开发中,一般页面的组成有 NavigationController  或者 其他的 UiViewController、UITabViewController 等等,

  • 在有NavigationController导航栏的话,使用[self.navigationColler pushViewController:animated:] 进入到下一个视图 ,使用[self.navigationController popViewControllerAnimated:] 返回到上一视图。
  • 在没有NavigationController导航栏的时候,使用[self presentViewController:animated:completion:] 进入到下一个视图,使用 [self dismissViewControllerAnimated:completion:];返回到上一个视图中。

presentedViewController 与  presentingViewController

案例说明 A.presentedViewController A控制器跳转到B控制器;B.presentingViewController 就是返回到A控制器。

总结

到此这篇关于iOS如何获取最顶层ViewController的文章就介绍到这了,更多相关iOS获取最顶层ViewController内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解析iOS10中的极光推送消息的适配

    解析iOS10中的极光推送消息的适配

    这篇文章主要介绍了解析iOS10中的极光推送消息的适配的相关资料,我们需要先安装Xcode8.0版本,接下来本文分步骤详细给大家介绍,需要的朋友可以参考下
    2016-09-09
  • iOS CoreData 增删改查详解

    iOS CoreData 增删改查详解

    这篇文章主要为大家详细介绍了iOS CoreData 增删改查的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • 详解iOS开发中Keychain的相关使用

    详解iOS开发中Keychain的相关使用

    这篇文章主要介绍了iOS开发中Keychain的相关使用,文中列举了一个使用Keychain来保存密码的例子,需要的朋友可以参考下
    2015-10-10
  • iOS 开发之 - 关闭键盘 退出键盘 的5种方式

    iOS 开发之 - 关闭键盘 退出键盘 的5种方式

    这篇文章主要介绍了iOS 开发之 - 关闭键盘 退出键盘 的5种方式的相关资料,需要的朋友可以参考下
    2016-09-09
  • 详解IOS串行队列与并行队列进行同步或者异步的实例

    详解IOS串行队列与并行队列进行同步或者异步的实例

    这篇文章主要介绍了详解IOS串行队列与并行队列进行同步或者异步的实例的相关资料,IOS中GCD的队列分为串行队列和并行队列,任务分为同步任务和异步任务,他们的排列组合有四种情况这里就一一分析下,需要的朋友可以参考下
    2017-07-07
  • IOS  Swift3 四种单例模式详解及实例

    IOS Swift3 四种单例模式详解及实例

    这篇文章主要介绍了IOS Swift3 四种单例模式详解及实例的相关资料,这里对四种单例模式进行了实例介绍 ,需要的朋友可以参考下
    2016-12-12
  • iOS开发输入自动填充UITextField背景色

    iOS开发输入自动填充UITextField背景色

    如何在iOS中实现输入时自动填充背景色的效果,首先,我们设置UITextField的背景色为初始颜色,然后,通过设置UITextField的代理,并监听UITextField的输入事件,我们在用户开始输入时将其背景色改变为高亮颜色,在用户结束输入时恢复为初始颜色
    2023-10-10
  • iOS 9无法访问HTTP的解决方法

    iOS 9无法访问HTTP的解决方法

    这篇文章主要为大家详细介绍了iOS 9无法访问HTTP的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • 如何在 iOS 应用中添加位置信息

    如何在 iOS 应用中添加位置信息

    这篇文章主要介绍了如何在 iOS 应用中添加位置信息,帮助大家更好的理解和学习使用ios,感兴趣的朋友可以了解下
    2021-02-02
  • IOS开发相册图片多选和删除的功能

    IOS开发相册图片多选和删除的功能

    之前小编有和大家分享过一篇关于从相册选取单张照片的文章,那么下面这篇文章跟大家分享下如何相册多图选择和删除,以及包括拍照功能,有需要的可以参考学习,下面来一起看看吧。
    2016-09-09

最新评论