2011-08-17 76 views
7

我在iOS中使用MPMoviePlayerController。我正在收听播放视频时可能遇到的任何错误。在我的错误处理程序中,我弹出一个UIAlertView。有时候错误可能会相互快速发生,因此多个警报框会叠加起来。为了更好的用户体验,如果仍然显示较早的警报,我不希望弹出另一个警报。如何防止叠加多个UIAlertView?

回答

5

试试这个:

设置一个布尔值,true当你弹出一个警告,它设置为false当您关闭警报,并经常检查布尔值,看它是否是true你弹出一个事件之前。如果它是true,则会知道您已经有一个警告窗口显示。

You can find this solution and some other discussion here

+0

绝对不是。你粘贴的代码与使用SPI一样糟糕,虽然它可能不会让你被拒绝(因为你很难找到子视图戳),这是正确的*应该*让你从应用中被拒绝商店。它也在假设UIAlertView是如何工作的,并且可能会在操作系统更新中破坏。 –

+0

谢谢,我已经删除了我的答案的一部分。 – mopsled

1

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

+0

有时系统警报弹出并导致奇怪的行为:( – powerj1984

0

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

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

这是无证的,因为它取决于内部视图的层次结构,虽然苹果公司不能抱怨这一点。一个更可靠的,但甚至更无证方法是检查是否`

[_UIAlertManager visibleAlert]

`是零。

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

0

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

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

它应该工作:

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