10

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

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

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

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

谢谢

4

6 回答 6

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;
}
于 2010-12-06T04:52:45.210 回答
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;
}
于 2010-12-06T06:17:22.650 回答
2

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

if(actionSheet.window)
    isBeingPresented = YES;
于 2011-08-29T16:25:23.160 回答
2

检测警报似乎相对容易,但操作表让我很难过。在 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;

}

于 2013-03-18T08:01:21.527 回答
1

thanx 的帮助,但是从 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;
于 2013-02-19T10:18:20.493 回答
1
-(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;
        } 
}
于 2015-03-09T12:05:50.273 回答