iOS解雇UIAlertView正在展示另一个

boo*_*hoo 21 uialertview dismiss ios

我有一个Utils类,当触发某些通知时会显示UIAlertView.有没有办法在展示一个新的UIAlertViews之前将其解雇?

当我使用应用程序进入后台时,我正在这样做

[self checkViews:application.windows];
Run Code Online (Sandbox Code Playgroud)

在applicationDidEnterBackground上

- (void)checkViews:(NSArray *)subviews {
    Class AVClass = [UIAlertView class];
    Class ASClass = [UIActionSheet class];
    for (UIView * subview in subviews){
        if ([subview isKindOfClass:AVClass]){
            [(UIAlertView *)subview dismissWithClickedButtonIndex:[(UIAlertView *)subview cancelButtonIndex] animated:NO];
        } else if ([subview isKindOfClass:ASClass]){
            [(UIActionSheet *)subview dismissWithClickedButtonIndex:[(UIActionSheet *)subview cancelButtonIndex] animated:NO];
        } else {
            [self checkViews:subview.subviews];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这使得applicationDidEnterBackground很容易,因为我可以使用application.windows

我可以使用AppDelegate或类似的东西来获取所有视图,循环它们并关闭任何UIAlertViews吗?

Ser*_*nsk 28

for (UIWindow* window in [UIApplication sharedApplication].windows) {
  NSArray* subviews = window.subviews;
  if ([subviews count] > 0)
    if ([[subviews objectAtIndex:0] isKindOfClass:[UIAlertView class]])
      [(UIAlertView *)[subviews objectAtIndex:0] dismissWithClickedButtonIndex:[(UIAlertView *)[subviews objectAtIndex:0] cancelButtonIndex] animated:NO];
}
Run Code Online (Sandbox Code Playgroud)

  • ......这就是为什么迭代私有内部视图结构是一个脆弱的过程. (3认同)
  • 看起来这不适用于iOS6. (2认同)

erk*_*diz 27

iOS6兼容版:

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

  • 这是一个老问题,但这不适用于IOS 7. (3认同)
  • 你有没有找到iOS 7的替代品? (3认同)