iOS如何获取最顶层ViewController详解
1获取当前屏幕显示的Viewcontroller
//获取当前屏幕显示的viewcontroller -(UIViewController*)getCurrentVC { ///下文中有分析 UIViewController*rootViewController=[UIApplicationsharedApplication].keyWindow.rootViewController; UIViewController*currentVC=[selfgetCurrentVCFrom:rootViewController]; returncurrentVC; } -(UIViewController*)getCurrentVCFrom:(UIViewController*)rootVC { UIViewController*currentVC; if([rootVCpresentedViewController]){ //视图是被presented出来的 rootVC=[rootVCpresentedViewController]; } if([rootVCisKindOfClass:[UITabBarControllerclass]]){ //根视图为UITabBarController currentVC=[selfgetCurrentVCFrom:[(UITabBarController*)rootVCselectedViewController]]; }elseif([rootVCisKindOfClass:[UINavigationControllerclass]]){ //根视图为UINavigationController currentVC=[selfgetCurrentVCFrom:[(UINavigationController*)rootVCvisibleViewController]]; }else{ //根视图为非导航类 currentVC=rootVC; } returncurrentVC; }
2分析
2.1UIApplication的简析
UIApplication的核心作用是提供了iOS程序运行期间的控制和协作工作,每一个程序在运行期必须有且仅有一个UIApplication(或则其子类)的一个实例,在程序启动运行时,会在main函数中创建一个UIApplication的单例实例,在代码中可以通过调用[UIApplicationsharedApplication]来得到这个单例实例的指针。
2.2 KeyWindow 的简析
在简析KeyWindow前我们先来看一看UIWindow的概念
UIWindow是UIView的子类,其在UIView添加了一些视图层级,管理视图,转发UIEvent对象的属性和Method等等
在上述实例中,我们通过 [UIApplicationsharedApplication]来获取的UIApplication的单例实例对象,然后通过实例对象的keyWindow再获取到当前活跃的window(或者说是当前显示的主窗口).
KeyWindow即指在IOS开发中活跃窗口,即能接到键盘和非触摸事件的一个窗口,一次只能有一个KeyWindow,在IOS开发中,我们可以通过设置UIWindowLevel的数值来设置最前端的窗口为哪个,Level数值越高的窗口越靠前,如果两个窗口的Level等级相同,则我们可以通过makeKeyAndVisible来显示KeyWindow
(void)makeKeyWindow;//让当前UIWindow变成keyWindow(主窗口)
(void)makeKeyAndVisible;//让当前UIWindow变成keyWindow,并显示出来
[UIApplicationsharedApplication].windows//获取当前应用的所有的UIWindow
[UIApplicationsharedApplication].keyWindow//获取当前应用的主窗口
view.window///获得某个UIView所在的UIWindow
makeKeyAndVisible与makeKeyWindow
- makeKeyWindow:只做了一件事就是使当前窗口成为主要窗口。当前窗口不一定显示出来
- makeKeyAndVisible:做了两件事使当前窗口成为主要窗口并显示当前窗口。如果只想显示的话,我们还可以通过设置其属性hidden为NO即可。=
becomeKeyWindow与resignKeyWindow
- becomeKeyWindow:程序自动调用,用来通知其他窗口当前容器已被设置为主窗口。我们不要主动调用此方法,此方法是系统自动调用的来发通知的,此方法的默认实现不执行任何操作,但子类可以覆盖它并使用它来执行与成为关键窗口相关的任务。
- resignKeyWindow:类似becomeKeyWindow,其是调用以通知窗口它将要注销掉主键窗口的身份.同样的切勿直接调用此方法。
2.3rootViewController属性
顾名思义:当前窗口的根视图
目前只有UIWindow有rootViewController这个属性,不要跟UINavigationController里面的根视图概念混淆。
UINavigationController其实并没有rootViewController这个属性!也就没有自带的setter方法。要设置其根视图只能通过如下方法
-(instancetype)initWithRootViewController:(UIViewController*)rootViewController;
获取uiwindow的根视图
方式一
AppDelegate*app=(AppDelegate*)[UIApplicationsharedApplication].delegate; UIViewController*rootViewController1=appdelegate.window.rootViewController;
方式二
UIWindow*window=[UIApplicationsharedApplication].keyWindow; UIViewController*rootViewController2=window.rootViewController;
需要注意的是:
在方式二中,UIAlertController、UIAlertView、UIActionSheet弹出后,上述这些View出现生成了一个新的window,加在了界面上面,所以keyWindow就会变成UIAlertControllerShimPresenterWindow这个类
2.4PresentedViewController简析
在ios开发中,一般页面的组成有NavigationController 或者其他的UiViewController、UITabViewController等等,
- 在有NavigationController导航栏的话,使用[self.navigationCollerpushViewController:animated:]进入到下一个视图,使用[self.navigationControllerpopViewControllerAnimated:]返回到上一视图。
- 在没有NavigationController导航栏的时候,使用[selfpresentViewController:animated:completion:]进入到下一个视图,使用[selfdismissViewControllerAnimated:completion:];返回到上一个视图中。
presentedViewController与 presentingViewController
案例说明A.presentedViewControllerA控制器跳转到B控制器;B.presentingViewController就是返回到A控制器。
总结
到此这篇关于iOS如何获取最顶层ViewController的文章就介绍到这了,更多相关iOS获取最顶层ViewController内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。