自定义弹窗——keyWindow和delegate.window

之前的自定义弹窗总是添加到keyWindow上,一直屡试不爽。最后遇到了一个bug。
自定义弹窗——keyWindow和delegate.window_第1张图片
bug描述:
1、在系统弹窗出现【之后】,添加到keyWindow上的视图【会】随着弹窗的消失而消失。
2、在系统弹窗出现【之前】,添加到keyWindow上的视图就【不会】随着弹窗的消失而消失。
通过上面的描述,可以看到我们可以通过2的方式来解决这个问题。但是怎样确保顺序呢?显然是不靠谱的方案。

最终解决方案:在系统弹窗出现【之前】,添加到keyWindow上的视图就【不会】随着弹窗的消失而消失。

我的demo请参考:https://github.com/wokenshin/Laboratory
全局搜索:KeyWindowVC 即可找到相关代码

那么为什么要将视图放在delegate.window上,而不是keyWindow上呢?
请看下图

如上图所述:默认情况下keyWindow和delegate.window是同一个对象(通过打印的内存地址可知)。但是当有系统弹窗出现的时候,keyWindow就变成了另外一个对象。
delegate.window 程序启动时设置的window对象
keyWindow 这个属性保存了[windows]数组中的[UIWindow]对象,该对象最近被发送了[makeKeyAndVisible]消息

另外这里的问题在之前已经有朋友遇到过了:
//参考 https://www.jianshu.com/p/b6964951a6be 文中也描述了相关的一些原因。主要与系统添加弹窗和keyWIndow关联之间的影响。

综上:在设计自定义弹窗的时候,为了避免上述“bug”的出现,我们应该将自定义view add到delegate.window而不是keyWindow上。

你可能感兴趣的:(iOS,UI)