在没有参考iOS 7的情况下找到UIAlertView

时间:2013-09-09 16:15:56

标签: ios objective-c cocoa-touch ios7

我在我的项目中使用了代码片段:UIAlertView without having 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中运行,我无法解除警报视图。调试时我发现它在循环中显示该视图属于类UITransitionView。非常混乱,因为我找不到这个视图类的快速文档。

任何想法如何解决这个问题?

5 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:15)

iOS 7解决方案

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

我不确定它是否可以被AppStore批准,但可以正常工作

UPD单行代码:

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

答案 2 :(得分:1)

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

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

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

    @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.
    }
    
  3. 这可能对其他人有所帮助,想到分享这个。

答案 3 :(得分:0)

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

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

答案 4 :(得分: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
}