【发布时间】:2011-08-17 21:08:00
【问题描述】:
我在 iOS 中使用MPMoviePlayerController。我正在收听播放视频时可能出现的任何错误。在我的错误处理程序中,我弹出一个UIAlertView。有时错误可能会快速连续发生,因此会堆叠多个警报框。为了更好的用户体验,如果仍然显示较早的警报,我希望不弹出另一个警报。
【问题讨论】:
标签: ios cocoa-touch
我在 iOS 中使用MPMoviePlayerController。我正在收听播放视频时可能出现的任何错误。在我的错误处理程序中,我弹出一个UIAlertView。有时错误可能会快速连续发生,因此会堆叠多个警报框。为了更好的用户体验,如果仍然显示较早的警报,我希望不弹出另一个警报。
【问题讨论】:
标签: ios cocoa-touch
试试这个:
弹出警报时将布尔值设置为true,关闭警报时将其设置为false,并在弹出事件之前始终检查布尔值是否为true。如果是true,你就会知道你已经显示了一个警告窗口。
【讨论】:
您可以自己轻松实现。由于您正在显示警报,并且您也是警报的代表,因此您知道它何时消失,您可以通过在警报显示和警报隐藏时设置布尔标志来轻松跟踪是否有可见的警报。这样,如果设置了布尔值,您就可以取消任何后续警报。
【讨论】:
当警报出现时,它会被移动到 _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 是否显示。
【讨论】:
据我所知,唯一的方法是跟踪您的应用程序中当前是否正在显示警报和/或当前是否正在关闭警报。尝试在 appDelegate 中显示警报,然后在每次警报关闭时使用通知通知 appDelegate。这样,appDelegate 就可以跟踪是否存在带有布尔标志变量的警报。
【讨论】:
使用新的 UIAlertViewController。如果您尝试在另一个警报处于视图中时显示警报,它会忽略它并输出如下所示的警告。对于想要堆叠警报的传统行为的人来说,这是一个令人讨厌的副作用,但对于您的情况,这是一个很好的解决方案。
Warning: Attempt to present <UIAlertController: 0x7f9ef34c17e0> on <MasterViewController: 0x7f9ef344ec90> which is already presenting (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
}
【讨论】: