iPhone:检测UIAlert/UIActionSheet是否打开

Reu*_*ven 10 iphone uialertview uiactionsheet

在我的iOS应用程序中,我有一个计时器启动,当它启动时,我需要能够检测是否有一个Alert(UIAlertView)或一个Action Sheet(UIActionSheet)打开.

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

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

是否有任何通知在打开时发送,或者任何遍历视图层次结构以检测它?

谢谢

Sam*_*hie 17

他们确实会在打开时发送警报,但仅限于他们delegate- 请检查此问题,以便找到解决该问题的方法.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;
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!我不得不对提案进行两项更改:(1)NSArray*中的子视图而不是UIView*.(2)似乎UIActionSheet不是第一个[0]子视图,而是第二个[1].所以我迭代了视图层次结构......代码发布为答案... (2认同)

Reu*_*ven 12

- (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;
}
Run Code Online (Sandbox Code Playgroud)