返回顶部
首页 > 资讯 > 移动开发 >iOS如何获取最顶层ViewController详解
  • 860
分享到

iOS如何获取最顶层ViewController详解

ios顶层viewcontroller 2022-05-21 20:05:55 860人浏览 八月长安
摘要

1 获取当前屏幕显示的 Viewcontroller //获取当前屏幕显示的viewcontroller - (UIViewController *)getCurrentVC {

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 分析

1 UIApplication 的简析

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

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, 其是调用以通知窗口它将要注销掉主键窗口的身份.同样的切勿直接调用此方法。

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这个类

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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: iOS如何获取最顶层ViewController详解

本文链接: https://lsjlt.com/news/30431.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • iOS如何获取最顶层ViewController详解
    1 获取当前屏幕显示的 Viewcontroller //获取当前屏幕显示的viewcontroller - (UIViewController *)getCurrentVC {...
    99+
    2022-05-21
    ios 顶层 viewcontroller
  • es6如何获取顶层对象
    本篇内容介绍了“es6如何获取顶层对象”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • iOS如何获取汉字(简体中文)笔画数详解
    思路 汉字字典库匹配笔画数 优点: 实现逻辑简单,字典库好扩展 缺点: 内存消耗较大(不过也能承担) 思路: 这种实现思路是比较简单的,具体思路是将简体汉字所有字都穷举出来,然后分别...
    99+
    2022-05-22
    ios 汉字 笔画数
  • iOS如何获取设备型号的最新方法总结
    在开发中,我们经常需要获取设备的型号(如 iPhone X , iPhone 8 Plus 等)以进行数据统计,或者做不同的适配。但苹果并没有提供相应的系统 API 让我们直接取得当...
    99+
    2022-05-19
    ios 设备 型号
  • iOS中如何获取某个视图的截图详析
    前言 最近在做SDK的截图,想触发类似系统的截屏功能,找了一圈,总结一下靠谱的几种方式。 我写了个UIView 的category,将这几种方式封装和简化了一下。 第一种情形截图...
    99+
    2022-05-29
    ios 视图 截图
  • 详解iOS开发获取当前控制器的正取方式
    背景 在开发过程中,经常需要获取当前 window, rootViewController, 以及当前 ViewController 的需求. 如果 .m 实现不是在当前视图情况下...
    99+
    2022-05-22
    iOS 当前控制器
  • vue如何获取元素到顶部的距离
    在Vue中,可以通过以下方式获取元素到顶部的距离:1. 使用ref属性给元素添加一个引用:```html......
    99+
    2023-08-09
    vue
  • java如何获取对象深层数据
    要获取对象的深层数据,可以使用递归方法来遍历对象的属性。```javapublic class Main {public stati...
    99+
    2023-09-15
    java
  • iOS tableView多输入框如何获取数据
    前言 难得有点空暇的时间,写写文章,一壶小茶,惬意。扯远了,言归正传。 大家在做App开发的时候,肯定遇到过在一个列表中有多个让用户填写资料的情况,类似于这样的界面: iOS 如果...
    99+
    2022-05-16
    ios tableview
  • Django路由层如何获取正确的url
    目录前言 Tips - django版本区别 路由匹配 无名分组&有名分组 无名分组 有名分组 小提示 反向解析 路由不涉及分组的反向解析 有名分组&无名分组的反向解...
    99+
    2024-04-02
  • 详解Java如何实现小顶堆和大顶堆
    大顶堆 每个结点的值都大于或等于其左右孩子结点的值 小顶堆 每个结点的值都小于或等于其左右孩子结点的值 对比图 实现代码 public class HeapNode{ ...
    99+
    2024-04-02
  • android如何获取textview最多显示
    方法一 工作中用的一个方法,虽然不算特别准确,但效果还是不错的,这里分享下。 private float getLineMaxNumber(String t...
    99+
    2024-04-02
  • mysql日期如何获取最大值
    这篇文章主要介绍了mysql日期如何获取最大值的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mysql日期如何获取最大值文章都会有所收获,下面我们一起来看看吧。操作步骤:1、首...
    99+
    2024-04-02
  • mongodb如何获取最新的数据
    在MongoDB中可以使用以下方法获取最新的数据:1. 使用find()方法查询所有数据,并按照时间戳(或其他排序字段)降序排序,然...
    99+
    2023-10-19
    mongodb
  • 详解iOS 轻松获取当前控制器的正确方式
    背景 在开发过程中,经常需要获取当前 window, rootViewController, 以及当前正在显示的 visibleController 的需求. 如果 .m ...
    99+
    2022-06-02
    iOS 控制器
  • 如何使用js获取扩展名详解
    目录一、使用正则表达式二、使用String中的split方法三、使用String的lastIndexOf方法四、附获取文件扩展名的另两种方法总结一、使用正则表达式 function...
    99+
    2024-04-02
  • jmap执行失败如何获取heapdump详解
    目录正文使用jmap -F使用gcore使用Linux内核的coredump机制正文 在之前的OOM问题复盘中,我们添加了jmap脚本来自动dump内存现场,方便排查OOM问题。...
    99+
    2023-05-16
    jmap获取heapdump jmap执行失败
  • SpringBoot如何获取Get请求参数详解
    目录前言一、直接在请求路径中二、参数跟在 号后面1,获取参数的基本方法2、使用 map 来接收参数3、接收一个集合4、通过对象接收参数总结前言 利用 Spring Boo...
    99+
    2022-12-08
    springboot get请求参数 spring boot获取请求参数 springboot 请求
  • jquery如何获取最后一个元素
    使用jquery获取最后一个元素的方法:1.新建html项目,引入jquery;2.在项目中创建p标签;3.使用$(document).ready()方法加载function函数;4.使用last()方法获取最后一个元素;具体步骤如下:首先...
    99+
    2024-04-02
  • mongodb如何获取最新的数据库
    在MongoDB中,可以使用以下方法获取最新的数据库:1. 使用`show dbs`命令来列出所有的数据库。这将显示所有已创建的数据...
    99+
    2023-09-04
    mongodb 数据库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作