如何防止多个 UIAlertView 堆叠?
Posted
技术标签:
【中文标题】如何防止多个 UIAlertView 堆叠?【英文标题】:How to prevent multiple UIAlertView from stacking up? 【发布时间】:2011-08-17 21:08:00 【问题描述】:我在 ios 中使用MPMoviePlayerController。我正在收听播放视频时可能出现的任何错误。在我的错误处理程序中,我弹出一个UIAlertView。有时错误可能会快速连续发生,因此会堆叠多个警报框。为了更好的用户体验,如果仍然显示较早的警报,我希望不弹出另一个警报。
【问题讨论】:
【参考方案1】:试试这个:
弹出警报时将布尔值设置为true
,关闭警报时将其设置为false
,并在弹出事件之前始终检查布尔值是否为true
。如果是true
,你就会知道你已经显示了一个警告窗口。
You can find this solution and some other discussion here.
【讨论】:
绝对不是。您粘贴的代码与使用 SPI 一样糟糕,虽然它可能不会让您被拒绝(因为很难找到像您正在做的那样戳子视图),但这是理所当然应该得到的东西你拒绝了应用商店。它还对 UIAlertView 的工作方式做出假设,并且可能会在操作系统更新时中断。 谢谢,我已经删除了这部分答案。【参考方案2】:您可以自己轻松实现。由于您正在显示警报,并且您也是警报的代表,因此您知道它何时消失,您可以通过在警报显示和警报隐藏时设置布尔标志来轻松跟踪是否有可见的警报。这样,如果设置了布尔值,您就可以取消任何后续警报。
【讨论】:
有时系统警报弹出并导致奇怪的行为:(【参考方案3】:当警报出现时,它会被移动到 _UIAlertOverlayWindow。因此,一个相当脆弱的方法是遍历所有窗口并检查是否有任何 UIAlertView 子视图。
-(BOOL)checkAlertViewVisibleStatus
for (UIWindow* window in [UIApplication sharedApplication].windows)
NSArray* subviews = window.subviews;
if ([subviews count] > 0)
if ([[subviews objectAtIndex:0] isKindOfClass:[UIAlertView class]])
return YES;
return NO;
这是未记录的,因为它取决于内部视图层次结构,尽管 Apple 不能抱怨这一点。一种更可靠但更无证的方法是检查 `
[_UIAlertManager 可见警报]
` 为零。
这些方法无法检查 SpringBoard 中的 UIAlertView 是否显示。
【讨论】:
【参考方案4】:据我所知,唯一的方法是跟踪您的应用程序中当前是否正在显示警报和/或当前是否正在关闭警报。尝试在 appDelegate 中显示警报,然后在每次警报关闭时使用通知通知 appDelegate。这样,appDelegate 就可以跟踪是否存在带有布尔标志变量的警报。
【讨论】:
【参考方案5】:使用新的 UIAlertViewController。如果您尝试在另一个警报处于视图中时显示警报,它会忽略它并输出如下所示的警告。对于想要堆叠警报的传统行为的人来说,这是一个令人讨厌的副作用,但对于您的情况,这是一个很好的解决方案。
Warning: Attempt to present <UIAlertController: 0x7f9ef34c17e0> on <MasterViewController: 0x7f9ef344ec90> which is already presenting (null)
【讨论】:
【参考方案6】:它应该可以工作:
-(BOOL) doesAlertViewExist
if ([[UIApplication sharedApplication].keyWindow isMemberOfClass:[UIWindow class]])
return NO;//AlertView does not exist on current window
return YES;//AlertView exist on current window
【讨论】:
以上是关于如何防止多个 UIAlertView 堆叠?的主要内容,如果未能解决你的问题,请参考以下文章
如何防止 Bootstrap 轮播图像堆叠? HTML/CSS(使用 PHP 显示图像)