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

如果我们为了某个功能单独封装了一个独立的类,我们就希望这个类尽可能独立,从而减少对于外部的依赖。比如我们想要单独封装一个获取通讯录的类,必须要有一个控制器可以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出新的页面,然后调用了这个方法,那么获取的就是动画之前的控制器。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值