UIAlertViews、UIActionSheets 和 keyWindow 问题

Posted

技术标签:

【中文标题】UIAlertViews、UIActionSheets 和 keyWindow 问题【英文标题】:UIAlertViews, UIActionSheets and keyWindow problems 【发布时间】:2013-11-06 15:32:42 【问题描述】:

我创建了一个ios 7 passcode replica,但我遇到了似乎无法解决的问题。我需要将锁屏视图置于其他所有内容之上,因此该应用程序包含在 iOS 的多任务视图中,因此我将其直接添加到 keyWindow。到目前为止一切都很好。

如果在我必须显示锁定屏幕时打开了alertViewactionSheet(为了简单起见,在这篇文章中只会提到alertViews),就会出现问题。已经回答了好几次了,iOS 7中没有alertViews的引用,确实如此,并且显示它们的窗口是_UIModalItemHostingWindow,其中有2个UIViews,确实没有引用alertView

这个_UIModalItemHostingWindow 也变成了新的keyWindow,所以它在其他一切之上,但在[UIApplication sharedApplication].windows 中找不到它,这意味着如果我将锁定屏幕添加到我以前的keyWindow(默认keyWindow,如果您愿意的话),它将位于alertView 及其暗色背景之下,因此用户在关闭alertView 之前无法与锁定屏幕交互。另一个选项将在下面进一步详细说明。

锁屏的工作原理是这样的:在applicationDidEnterBackground 上,它会检查密码是否已启用;如果启用并且密码持续时间为 0(用户选择立即锁定应用程序),它现在添加锁定屏幕,因此它在多任务视图中覆盖应用程序。现在,我上面提到的选项是将alertView添加到这个_UIModalItemHostingWindow窗口,但是当返回应用程序时,锁定屏幕视图显示延迟1+秒(即使我在去之前添加了它)背景!)并且该应用程序没有被多任务视图中的任何内容覆盖。 (目前也显示在错误的位置,如果你继续下载它,那是固定的,但我还没有推送提交。

我尝试隐藏和removeFromSuperview 这个_UIModalItemHostingWindow,但是当回到应用程序时,alertView 动画仍然像刚刚被触发一样运行。我怀疑上述延迟也会发生,因为 Apple 在返回前台时如何处理 alertViews

我还尝试创建一个新窗口并将其设为新的keyWindow,但同样的事情发生了。

这是一个关于这个的小讨论,涵盖了我尝试过的所有东西,也许我在这篇文章中遗漏了一些东西。 https://github.com/rolandleth/LTHPasscodeViewController/issues/16

有什么想法吗?除了在我的应用程序中创建对每个 alertViewactionSheet 的手动引用,因为我正在尝试为密码库而不是我自己的应用程序找到修复程序;我可以为此找到肮脏的解决方法,没问题:)

更新:如果使用actionSheet 而不是alertView,则窗口为_UIAlertOverlayWindow,但据我所知,它的行为相同。

【问题讨论】:

对于UIActionSheet的情况,它的窗口_UIAlertOverlayWindow在[UIApplication sharedApplication].windows中可用,所以可以通过actionsheet解决问题。我也没有得到,alertview的情况如何解决 【参考方案1】:

最简单的解决方案是使用锁屏窗口而不是锁屏视图。

创建一个新的UIWindow,将其框架设置为UIScreen 边界,在此处放置一个简单的rootViewController,用于处理旋转并显示您的“锁定屏幕”视图,并将windowLevel 设置为UIWindowLevelAlert + 1

然后将窗口的hidden 设置为YES。当你想显示锁屏时,只需将hidden 设置为NO

我猜想在显示弹出框/操作表以及显示键盘时(键盘在键窗口顶部有自己的窗口)时,向keyWindow 添加视图也不起作用。

【讨论】:

我已经尝试创建一个新的 UIWindow 并将其级别设置为 1997 (UIWindowLevelAlert + 1),该值确实是 1997,但带有alertView 的窗口仍然出现在顶部。返回前台时,它只是重新运行射击动画。将视图添加到 keyWindow 会产生我所描述的问题,在进入后台之前没有被添加,在多任务视图上没有显示,并且在 alertView 动画播放之后从前台以相当大的延迟后显示。 嗯,我之前显然做错了什么,因为现在我尝试再次创建一个新的 UIWindow,它出现在 actionSheet 上。嗯,这已经不重要了,但我想知道我以前做错了什么。会带着最终结果回来,因为我现在必须离开。 嗯,这很有趣。这种方法有效,但它有这个问题:如果在进入后台时没有显示actionSheetalertView,则在返回时它可以正常工作(包括键盘出现)。如果其中一个在进入后台时出现,则返回时窗口会正确显示在所有内容上,但键盘不会显示。除了alertView/actionSheet的存在之外没有其他区别。 @Roland 你把它作为关键窗口吗? 我正要跳进去说是的,我是,但显然我做错了地方。我移动了makeKeyAndVisible,现在键盘正确显示。但它不想消失,直到 actionSheet/alertView 被解雇。被解雇的那一刻,键盘也被解雇了。我打电话给resignKeyWindow(在锁定窗口上)和resignFirstResponder(在testField上)。因此,当密码输入正确时,窗口被隐藏,键盘保持可见,AV/AS 窗口出现,我必须关闭它,所以键盘也会退出。

以上是关于UIAlertViews、UIActionSheets 和 keyWindow 问题的主要内容,如果未能解决你的问题,请参考以下文章

UIAlertViews、UIActionSheets 和 keyWindow 问题

同一个视图中的多个 UIAlertViews

iOS 在显示另一个之前关闭 UIAlertView

iPad actionsjeet

解锁 iPhone 时推送通知警报会打开应用程序

推送通知警报在 ios 4.2 中解锁 iPhone 时应用程序无法打开