我可以检查现在是不是显示任何 UIAlertView 吗? [复制]

Posted

技术标签:

【中文标题】我可以检查现在是不是显示任何 UIAlertView 吗? [复制]【英文标题】:Can i check if any UIAlertView displaying right now? [duplicate]我可以检查现在是否显示任何 UIAlertView 吗? [复制] 【发布时间】:2014-01-17 07:12:09 【问题描述】:

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

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

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

【问题讨论】:

检查这个问题:link 它是一个私有 API,但在某处我读到使用 performselector 与 Apple 的静态代码分析是可以的。但你需要加倍确定。 【参考方案1】:

对于低于 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 中唯一真正的选择是实际跟踪您的警报视图。

【讨论】:

谢谢。蛮力,但它的工作。 你试过了吗?我现在试了,还是不行。始终“AlertView 不可用”。 它不适用于 ios7 设备。因为在 ios7 设备中使用了 keywindow。 这可行,但我认为您应该保留对警报视图的引用... 您编辑的答案指向使用问题中提出的私有 API。【参考方案2】:

你可以这样检查。

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

【讨论】:

此解决方案不适用于 iOS 7 及更高版本。 iOS 7 以后还有其他方法吗?

以上是关于我可以检查现在是不是显示任何 UIAlertView 吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

用于检查值是不是存在的 Excel 公式,否则不显示任何内容 - 也使用条件格式

如何检查任何设备是不是支持表情符号?

检查数组是不是已经完全填充了任何非默认值

检查 div 是不是包含这些单词中的任何一个,如果是,则显示此 div

检查 Espresso 是不是显示对话框

检查是不是存在任何错误消息并在 laravel 中显示所有错误消息