诡异的Window!!!

158 阅读2分钟

需求:每天首次进入房间之后,弹出充值弹窗且不被任何其他弹窗覆盖,然后点击空白区域关掉弹窗。

实现:由于要实现不被任何弹窗覆盖,决定创建一个level = alert + 1的window出来做弹窗容器。

现象:进入房间弹窗OK,退出房间之后,卧槽!那个window又展示出来,盖在了keywindow上啦!!!!!

没有再次调用这个方法的地方,为毛还会展示这个window呢????明明已经remove了,明明已经置为nil了,TA为什么还会出来????

经过一系列的查找,发现此处有鬼:

我创建testWindow的Tag = 10001 而且KXSignInPopViewTag这个宏也等于10001,那也就是说,[[UIApplication sharedApplication].keyWindow viewWithTag:KXSignInPopViewTag]这行代码取到了本应该被移除并置为nil的testWindow。

通过逐步调试发现:

1,当我添加testWindow到keyWindow之上时:

2,当我移除testWidow并置为nil之后:

3,当我在这里通过tag获取视图时:

1,通过前两次的打印可以看出,keyWindow的子视图数组并没有变化,也就是讲testWindow并没有从父视图上移除,引用计数不会等于0,也不会真正的被销毁!!!2,通过第三次打印验证,取到的pop确实就是testWindow!!!

总结:

1,Window是个特殊的UIView,它不需要父视图,只需要把hidden属性设置为NO就可以展示。如果给Window设置了父视图,removefromSuperView没有效果。

2,视图Tag的管理是个很难的事情,所以能不用Tag的地方尽量少用。如果项目组几个人开发的话,一定要分好Tag区间。比如开发者A所有视图的Tag要从10000起,开发者B从20000起。。。这样可以避免一些Tag相同导致的问题,但是者肯定不是一个好办法!

3,[UIApplication sharedApplication].keyWindow这个Window并不是固定的,那个window设置了makeKeyWindow,对应的就是那个Window。

4,推荐阅读链接