【问题标题】:iPhone: detecting if a UIAlert/UIActionSheet are openiPhone:检测 UIAlert/UIActionSheet 是否打开
【发布时间】:2011-05-20 18:48:45
【问题描述】:

在我的 iOS 应用程序中,我启动了一个计时器,当它启动时,我需要能够检测是否有警报 (UIAlertView) 或操作表 (UIActionSheet) 打开。

一种方法是修改显示警报/操作表的代码 - 但不幸的是,这不是我的选择。

所以,问题是 - 有没有办法知道/检测是否已打开警报或操作表?

是否在打开时发送任何通知,或通过任何视图层次结构来检测它?

谢谢

【问题讨论】:

    标签: iphone uialertview uiactionsheet


    【解决方案1】:

    他们在打开时确实会发送警报,但只发送给他们的delegate -- 检查this question 以获得解决该问题的好方法。 Techzen 建议在您打开警报时将布尔标志设置为 YES,并在您关闭警报时将其设置回 NO

    编辑:

    既然您根本无法访问代码,何不试试这段笨拙的代码:

    -(BOOL) doesAlertViewExist {
      for (UIWindow* window in [UIApplication sharedApplication].windows) {
        NSArray* subviews = window.subviews;
        if ([subviews count] > 0) {
    
          BOOL alert = [[subviews objectAtIndex:0] isKindOfClass:[UIAlertView class]];
          BOOL action = [[subviews objectAtIndex:0] isKindOfClass:[UIActionSheet class]];
    
          if (alert || action)
            return YES;
         }
      }
      return NO;
    }
    

    【讨论】:

    • 谢谢!我必须对提案进行两项更改:(1) NSArray* 中的子视图,而不是 UIView*。 (2) 好像 UIActionSheet 不是第一个 [0] 子视图,而是第二个 [1]。所以我迭代了视图层次结构......代码作为答案发布......
    • 我使用了 TechZen 的其他建议,即保留参考。我发现这非常优雅。
    【解决方案2】:
    - (BOOL) doesAlertViewExist {
        for (UIWindow* window in [UIApplication sharedApplication].windows) {
            for (UIView* view in window.subviews) {
                BOOL alert = [view isKindOfClass:[UIAlertView class]];
                BOOL action = [view isKindOfClass:[UIActionSheet class]];
                if (alert || action)
                    return YES;
            }
        }
        return NO;
    }
    

    【讨论】:

    • 你好,我也面临同样的问题,我尝试使用上面的代码但是当我尝试打印“window.subviews”数组时,没有得到任何 uiactionsheet 对象。在此之前我一直打开一个操作表.可能是什么问题,请对此给出一些解决方案
    • 我只在 iPhone 上使用过这个代码 - 你会不会是在 iPad 上使用它?
    • 在 ipad 上根本不工作。 :(
    【解决方案3】:

    您还可以检查视图的窗口属性:

    if(actionSheet.window)
        isBeingPresented = YES;
    

    【讨论】:

      【解决方案4】:

      检测警报似乎相对容易,但操作表让我很难过。在 iOS 6.1 中,我不得不更进一步

      BOOL IsActionOpen(UIView* aView) {
      BOOL    actionOpen = NO;
      if (aView) {
          if ([aView isKindOfClass:[UIActionSheet class]]) {
              actionOpen = YES;
          }
          else if (aView.subviews.count > 0) {
              for (UIView* aSubview in aView.subviews) {
                  if ( IsActionOpen( aSubview)) {
                      actionOpen = YES;
                      break;
                  }
              }
          }
      }
      return actionOpen;
      

      }

      - (BOOL) isAnActionSheetOpen {
      BOOL    actionOpen = NO;
      for (UIWindow* w in [UIApplication sharedApplication].windows) {
          actionOpen =  IsActionOpen(w);
          if (actionOpen)
              break;
      }
      return actionOpen;
      

      }

      【讨论】:

      【解决方案5】:

      感谢您的帮助,但从 iOS 6 开始,该代码段不再起作用。 但是,我用这段代码解决了这个问题。希望这会有所帮助

      for (UIWindow* window in [UIApplication sharedApplication].windows) {
          NSArray* subviews = window.subviews;
          if ([subviews count] > 1) {
              BOOL alert = [[subviews objectAtIndex:1] isKindOfClass:[UIAlertView class]];
              BOOL action = [[subviews objectAtIndex:1] isKindOfClass:[UIActionSheet class]];
      
              if (alert || action)
                  return YES;
          }
      }
      return NO;
      

      【讨论】:

        【解决方案6】:
        -(BOOL)GetKeyWindow {    
                UIViewController *presentedViewController = myAppDelegate.window.rootViewController.presentedViewController;
        
                if (presentedViewController) {
        
                    if ([presentedViewController isKindOfClass:[UIActivityViewController class]] || [presentedViewController isKindOfClass:[UIAlertController class]]) {        
        
                        return YES;
                    }else{
                        return NO;
                        NSLog(@"not present");
                    }   
                }
                else{
                    return NO;
                } 
        }
        

        【讨论】:

          猜你喜欢
          • 2011-09-01
          • 2015-08-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-07
          相关资源
          最近更新 更多