如何防止多个UIAlertView堆叠?

时间:2011-08-17 21:08:01

标签: ios cocoa-touch

我在iOS中使用MPMoviePlayerController。我正在聆听播放视频时可能遇到的任何错误。在我的错误处理程序中,我弹出一个UIAlertView。有时,错误可能会彼此快速连续发生,因此会出现多个警报框。为了获得更好的用户体验,如果仍然显示较早的警报,我希望不会弹出另一个警报。

6 个答案:

答案 0 :(得分:6)

试试这个:

弹出警报时将布尔值设置为true,关闭警报时将其设置为false,并在弹出之前始终检查布尔值是否为true举办活动。如果是true,您就会知道您已经显示了一个警告窗口。

You can find this solution and some other discussion here

答案 1 :(得分:1)

你可以自己轻松地实现这一点。由于您正在显示警报,并且您也是警报的代理,因此您知道它何时消失,您可以通过在警报显示和警报隐藏时设置布尔标志来轻松跟踪是否可以看到警报。这样,如果设置了布尔值,则可以撤消任何后续警报。

答案 2 :(得分:1)

当出现警报时,它将被移动到_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 visibleAlert]

`是零。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

Warning: Attempt to present <UIAlertController: 0x7f9ef34c17e0>  on <MasterViewController: 0x7f9ef344ec90> which is already presenting (null)

答案 5 :(得分:0)

应该有效:

if (NameTextBox.Text == (AccountsList.Items[i] as Account).Name)