iOS基础iOS进阶指南iOS底层基础知识

使用keyWindow要注意一点

2017-03-10  本文已影响1579人  311ca7a27754

前两天出去面试的时候被问到一个问题:keyWindow获取到的window会不会发生改变?

        讲真的以前用到的东西都是只要能用就行了,没有过多的取研究为什么不能用,为什么要这么用,这几天的面试让我也学好了很多东西,我们不能停留在会用的基础上了,言归正传,下班我们来看一下keyWindow什么情况下会发生改变:

首先我们先来看一下正常情况下获取到的keyWindow是哪一个window:

没有弹出层的情况下

       很明显正常情况下得到的是UIWindow类,这是我们需要的类,那么我们试一下在弹出层弹出之后,再去获取keyWindow得到的是哪一个:

有弹出层情况下

        这个时候得到的keyWindow变成了UIAlertControllerShimPresenterWindow,说明keyWindow的类发生了改变。那这个时候添加view和移除view时,view会怎么变化呢。

展示弹出层的时候 移除弹出层的时候

          这两个对比很明显,弹出前和弹出后view添加的图层发生了改变,而当移除的时候UIAlertControllerShimPresenterWindow上添加的view也被移除了。说明移除弹出层之后这个keyWindow——UIAlertControllerShimPresenterWindow 也会被移除掉 ,或者说是keyWindow类变成了UIWindow。

总结一点:

1.经过测试keyWindow永远是覆盖在视图的最外层,在正常情况下获取到的keyWindow是UIWindow;

 2.在有UIAlertView或UIActionSheet的弹出层情况下,在去获取keyWindow这个时keyWindow就会变成UIAlertControllerShimPresenterWindow这个类,是弹出层上层的一个window;

3.在UIAlertView或UIActionSheet弹出后再给keyWindow添加的view,会在UIAlertView弹出层消失后,keyWindow上边的视图也会随之消失;

  所以如果要可以使用UIApplication.shared.windows.last(获取到的图层是UIWindow)去添加view,这样又弹出层的话还是添加到系统的弹出层下,不会随着弹出层的消失而消失。

以上只是个人见解,仅供参考。

上一篇 下一篇

猜你喜欢

热点阅读