之前的自定义弹窗总是添加到keyWindow上,一直屡试不爽。最后遇到了一个bug。

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]消息
另外这里的问题在之前已经有朋友遇到过了:
//参考

本文探讨了在自定义弹窗时遇到的一个bug,即视图在系统弹窗出现后可能消失。问题的关键在于理解keyWindow和delegate.window之间的区别。当系统弹窗出现时,keyWindow会改变,而delegate.window保持不变。为了解决这个问题,作者建议将自定义视图添加到delegate.window上,而不是keyWindow,以确保视图在系统弹窗出现后仍然可见。文章提供了一个相关代码的GitHub链接以及参考资料,帮助读者理解并避免此类问题。
最低0.47元/天 解锁文章
6341

被折叠的 条评论
为什么被折叠?



