Ios 如何防止多个UIAlertView堆叠?

Ios 如何防止多个UIAlertView堆叠?,ios,cocoa-touch,Ios,Cocoa Touch,我用的是iOS。我正在收听播放视频时可能出现的任何错误。在我的错误处理程序中,我会弹出一个。有时错误可能会很快相继发生,因此多个警报框会堆叠起来。为了获得更好的用户体验,我不希望在仍然显示早期警报的情况下再弹出另一个警报 试试这个: 弹出警报时将布尔值设置为true,关闭警报时将布尔值设置为false,并在弹出事件之前始终检查布尔值是否为true。如果它是true,您将知道已经显示了一个警报窗口 .您可以自己实现这一点。由于您正在显示警报,并且您也是警报的代理,因此您可以知道警报何时消失,只需在

我用的是iOS。我正在收听播放视频时可能出现的任何错误。在我的错误处理程序中,我会弹出一个。有时错误可能会很快相继发生,因此多个警报框会堆叠起来。为了获得更好的用户体验,我不希望在仍然显示早期警报的情况下再弹出另一个警报

试试这个:

弹出警报时将布尔值设置为
true
,关闭警报时将布尔值设置为
false
,并在弹出事件之前始终检查布尔值是否为
true
。如果它是
true
,您将知道已经显示了一个警报窗口


.

您可以自己实现这一点。由于您正在显示警报,并且您也是警报的代理,因此您可以知道警报何时消失,只需在警报显示和警报隐藏时设置布尔标志,就可以轻松跟踪是否有可见的警报。这样,如果设置了布尔值,则可以取消任何后续警报。

据我所知,唯一的方法是跟踪应用程序中当前是否显示警报和/或是否取消警报。尝试在appDelegate中显示警报,然后在每次警报关闭时使用通知通知appDelegate。这样,appDelegate将跟踪是否存在带有布尔标志变量的警报。

当警报出现时,它将被移动到_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;
}
这是没有文档记录的,因为它取决于内部视图层次结构,尽管苹果不能对此抱怨。一种更可靠但更无文档记录的方法是检查`

[[u UIAlertManager visibleAlert]

`是零


这些方法无法检查是否显示来自SpringBoard的UIAlertView。

使用新的UIAlertViewController。如果您试图在另一个视图中显示警报,它将忽略该警报并输出如下所示的警告。对于那些希望采用堆叠警报的传统行为的人来说,这是一个令人讨厌的副作用,但对于你来说,这是一个很好的解决方案

Warning: Attempt to present <UIAlertController: 0x7f9ef34c17e0>  on <MasterViewController: 0x7f9ef344ec90> which is already presenting (null)
警告:尝试呈现已呈现的内容(null)
它应该可以工作:

-(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
}

绝对不是。你粘贴的代码和使用SPI一样糟糕,虽然它可能不会让你被拒绝(因为很难找到像你这样戳的子视图),但它应该让你从应用商店中被拒绝。它还对UIAlertView的工作原理进行了假设,并可能在操作系统更新时中断。谢谢,我已经删除了答案中的这一部分。有时系统警报会弹出并导致奇怪的行为:(