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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前的自定义弹窗总是添加到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]对象,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值