12

我在我的项目中使用了一个代码片段,在这里得到了回答:UIAlertView without has reference to it

这是代码:

+ (UIAlertView *) getUIAlertViewIfShown {
    if ([[[UIApplication sharedApplication] windows] count] == 1) {
        return nil;
    }

    UIWindow *window = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
    if ([window.subviews count] > 0) {
        UIView *view = [window.subviews objectAtIndex:0];
        if ([view isKindOfClass:[UIAlertView class]]) {
            return (UIAlertView *) view;
        }
    }
    return nil;
}

不幸的是,它在 iOS 7 中不起作用,我无法关闭警报视图。在调试时,我发现在循环中它显示 view 是 class UITransitionView。相当混乱,因为我找不到这个视图类的任何快速文档。

有什么想法可以解决这个问题吗?

4

5 回答 5

16

在 iOS7 中,UIAlertView窗口不会出现在-[UIApplication windows]. 事实上,它UIAlertView本身永远不会添加到任何窗口中,-[UIAlertView window]始终是nil. 相反,警报视图管理放置在-[UIApplication keyWindow]其中的各种未记录的视图,而不引用回警报视图。

您在 iOS7 中唯一真正的选择是实际跟踪您的警报视图。

于 2013-09-09T17:16:13.217 回答
15

iOS 7 解决方案

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

我不确定它是否可以被 AppStore 批准,但可以

UPD单行代码:

UIAlertView *topMostAlert = [NSClassFromString(@"_UIAlertManager") performSelector:@selector(topMostAlert)];
于 2013-10-09T14:46:28.313 回答
1

我遇到了类似的问题,在我的情况下,警报是从视图控制器的不同实例中显示的,正如 Brian 已经提到的那样,该UIAlertView窗口不会出现[UIApplication windows]在 iOS7 中。

因此,可以遵循以下方法来跟踪 -

  1. BOOL在 App Delegate 中定义一个常量 -

    @property (nonatomic, assign) BOOL isAlertVisibleOnAppWindow;
    
  2. 如果存在“UIAlerView”,请检查早期实例是否存在 -

    AppDelegate *delegate = (AppDelegate *) [UIApplication sharedApplication].delegate;
    if (!delegate.isAlertVisibleOnAppWindow) {
        delegate.isAlertVisibleOnAppWindow = YES;
    
        UIAlertView *alertView = [[UIAlertView alloc] init…//alert init code
    
        // Either handle alert cancel/completeion click here via blocks, or use alert delegates to reset the isAlertVisibleOnAppWindow BOOL variable to NO.
    }
    

这可能对其他人有帮助,想到分享这个。

于 2014-07-10T10:00:00.683 回答
0

您可以注册到UIWindowDidBecomeVisibleNotification

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(aWindowBecameVisible:)
                                             name:UIWindowDidBecomeVisibleNotification
                                           object:nil];

并在 aWindowBecameVisible 检查窗口描述_UIModalItemHostingWin

if ([[theWindow description] hasPrefix:@"<_UIModalItemHostingWin"])
{
    // This is the alert window
}
于 2014-05-31T20:24:55.537 回答
0
UIAlertView *topMostAlert = [NSClassFromString(@"_UIAlertManager") performSelector:@selector(topMostAlert)];

这将不允许发布到 Apple Store。在构建验证期间,Xcode 会抛出一个错误,例如:“访问未记录的方法..”所以你不能使用它,但是这个代码运行良好。

于 2014-04-28T07:37:20.547 回答