我可以检查现在是否有任何UIAlertView显示?

时间:2014-01-17 07:12:10

标签: ios iphone objective-c ipad

我可以在iOS应用程序的任何部分检查是否有任何UIAlertView现在显示?我找到了这段代码

[NSClassFromString(@"_UIAlertManager") performSelector:@selector(topMostAlert)]

但它是私有API,我的应用可能被Apple拒绝。 有没有合法的方法可以做到这一点?

2 个答案:

答案 0 :(得分:7)

对于低于iOS 7的设备:

当您制作UIAlertView的正文时,[alertView Show]会在主窗口中添加子视图。因此,要检测UIAlertView,您只需检查当前UIView的子视图,UIAlertView继承自UIView

for (UIWindow* window in [UIApplication sharedApplication].windows){
    for (UIView *subView in [window subviews]){
        if ([subView isKindOfClass:[UIAlertView class]]) {
            NSLog(@"AlertView is Present");
        }else {
            NSLog(@"AlertView Not Available");
        }
    }
}

编辑: - 适用于使用iOS 7的设备

Class UIAlertManager = objc_getClass("_UIAlertManager");
UIAlertView *Alert = [UIAlertManager performSelector:@selector(Alert)];

UIAlertView *Alert = [NSClassFromString(@"_UIAlertManager") performSelector:@selector(Alert)];

注: - 如果您无法使用第三方API,那么iOS7中唯一真正的选项是实际跟踪您的提醒视图。

答案 1 :(得分:1)

你可以这样检查。

-(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;
}