从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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
在alertview中选择取消按钮时如何从数组中关闭所有alertview?