我在我的项目中使用了代码片段: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
。非常混乱,因为我找不到这个视图类的快速文档。
任何想法如何解决这个问题?
答案 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]
中。
因此,为了跟踪以下方法,可以遵循 -
在App Delegate中定义BOOL
常量 -
@property (nonatomic, assign) BOOL isAlertVisibleOnAppWindow;
如果存在'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 :(得分: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
}