如何通过代码获取当前正在显示的控制器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/WangErice/article/details/51584410

如果我们为了某个功能单独封装了一个独立的类,我们就希望这个类尽可能独立,从而减少对于外部的依赖。比如我们想要单独封装一个获取通讯录的类,必须要有一个控制器可以present出来一个ABPeoplePickerNavigationController,当然我们可以通过外部传入当前的控制器,可是总觉得很别扭,那么怎么能在类内部获取当前正在显示的控制器呢?

虽然我们不能直接获取当前正在显示的控制器,可是每个应用只有一个主窗口,我们可以获取这个UIWindow对象,然后通过一定的方法遍历到当前控制器。而keyWindow只有一个rootViewController,这个控制器要么是UITabBarController或者其子类,要么是UINavigationController或者其子类,要么是UIViewController或者其子类,我们暂且称其为A,而后出现的控制器都是由它们push,present出来的,然后就可以递归了,我是不是很机智(~!~)?

下面就让我们来进行分类讨论:

a) 假如A是UITabbarController或者其子类,那么我们就可以很容易地通过selectedViewController属性很容易地找到下一级控制器;

b)假如A是UINavigationController或者其子类,那么我们可以通过visibleViewController属性来获取该控制器push出来的最后一级控制器;

c)假如A是UIViewController或者其子类,那么该控制器想要展示出来一个控制器,只能通过present的方式来展现出新的控制器,所以我们可以通过

presentedViewController不为空来获取下一级控制器,如果为空则已经是在显示的控制器;

上边三种情况已经覆盖了所有的控制器类型,所以我们通过递归就可以寻找到当前正在显示的控制器。

主要实现代码如下:


貌似好像实现了,不过分类需要慎重。猜猜看,不足之处会在哪里?

比如我选择使用动画效果push出新的页面,然后调用了这个方法,那么获取的就是动画之前的控制器。



猜你喜欢

转载自blog.csdn.net/WangErice/article/details/51584410