【问题标题】:How to prevent multiple UIAlertView from stacking up?如何防止多个 UIAlertView 堆叠?
【发布时间】:2011-08-17 21:08:00
【问题描述】:

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

【问题讨论】:

    标签: ios cocoa-touch


    【解决方案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
          }
          

          【讨论】:

            猜你喜欢
            • 2012-10-07
            • 1970-01-01
            • 2016-02-18
            • 2011-05-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-12
            相关资源
            最近更新 更多