从iOS7中的应用程序中关闭所有UIAlertview [重复]

Posted

技术标签:

【中文标题】从iOS7中的应用程序中关闭所有UIAlertview [重复]【英文标题】:Dismiss all UIAlertview from application in iOS7 [duplicate] 【发布时间】:2013-12-27 13:02:31 【问题描述】:

当我进入后台模式时,我想删除应用程序中的所有 UIAlertview。我正在使用以下代码来执行此操作。

for (UIWindow* w in [UIApplication sharedApplication].windows)
    for (NSObject *o in w.subviews)
    
        if ([o isKindOfClass:[UIAlertView class]])
        
            [(UIAlertView *)o dismissWithClickedButtonIndex:[(UIAlertView *)o cancelButtonIndex] animated:YES];
        
    

它在 ios6 中可以正常工作。当我在 iOS7 设备上运行相同的应用程序时,它不起作用。有什么想法吗?

【问题讨论】:

怎么不行?究竟会发生什么?它是否进入if statement 不,它不会进入 if 语句甚至警报视图可见 在 iOS7 中,windows 不包含警报视图窗口。它们由另一个未暴露的窗口堆栈管理。 【参考方案1】:

有一个 _UIAlertManager 私有类,它有一个 topMostAlert 方法,它返回最重要的警报。这也适用于 iOS 7.0。

UIAlertView *topAlert = [NSClassFromString(@"_UIAlertManager") 
performSelector:@selector(topMostAlert)]

【讨论】:

这对 AppStore 来说是不安全的。【参考方案2】:

试试这个

UIWindow *window = [UIApplication sharedApplication].keyWindow;
for (UIView *view in w.subviews) 
    if ([view isKindOfClass:[UIAlertView class]]) 
        [(UIAlertView *)view dismissWithClickedButtonIndex:[(UIAlertView *)view cancelButtonIndex] animated:YES];
    

【讨论】:

这也行不通。此代码在 iOS6 本身中停止工作。 这不会从窗口的子视图中检测到 UIAlertView。【参考方案3】:

请用这个希望对你有帮助

    for (UIWindow* w in [UIApplication sharedApplication].windows) 
      for (NSObject *o in w.subviews) 
         for (NSObject *secnonO in o.subviews) 
          if ([secnonO isKindOfClass:[UIAlertView class]]) 
              [(UIAlertView *)o dismissWithClickedButtonIndex:[(UIAlertView *)o cancelButtonIndex] animated:YES];
           
         
       
   

【讨论】:

NSObject 类没有 subviews 属性 这不适用于 iOS7。 还有其他方法可以做到这一点【参考方案4】:

使用这种递归方法

- (void)removeAlert:(NSArray *)subviews 
    for (UIView * subview in subviews)
        if ([subview isKindOfClass:[UIAlertView class]])
            [(UIAlertView *)subview dismissWithClickedButtonIndex:[(UIAlertView *)subview cancelButtonIndex] animated:NO];
         else 
            [self removeAlert:subview.subviews];
        
    

像这样从 applicationDidEnterBackground 调用它

[self removeAlert:application.windows];

希望这会有所帮助。

【讨论】:

不适用于 iOS7。 windows 不包含警报视图窗口。

以上是关于从iOS7中的应用程序中关闭所有UIAlertview [重复]的主要内容,如果未能解决你的问题,请参考以下文章

ios 7 中的区域监控

在alertview中选择取消按钮时如何从数组中关闭所有alertview?

在 ios 7 和 ios9+ 中关闭 ViewController 的异常行为

以编程方式快速从所有视图层次结构中关闭键盘

我可以从 Main 构造函数中关闭程序吗?

是否可以从 iPhone 应用程序中关闭漫游?