如何知道我的keywindow.rootViewController是否是一个警报?

时间:2015-04-16 22:06:18

标签: ios objective-c ios8 uialertcontroller

我遇到问题,要确定我的 keywindow.rootViewController 是否是UIAlertController对象。这一定非常简单,但我不知道我的代码有什么问题:

UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;

if( [rootViewController isKindOfClass:[UIAlertController class]]){
    // Do something
}

为什么我从未输入IF STATEMENT,即使我在调试中看到该控制器的视图是 _UIAlertControllerView * ?还有其他方法可以检查我的密钥窗口是否为警报?

感谢。

1 个答案:

答案 0 :(得分:1)

我认为您要做的是能够检查应用程序中的任何视图控制器是否显示警报,但您不确定哪个控制器正在显示警报但无法访问到警报本身。

我必须处理这几次。在以前版本的iOS中,您可以遍历窗口的所有子视图以检查UIAlertView是否位于顶部,但是对于iOS8中的警报更改,这不再有效,因为所有代理都已弃用,Apple现在建议您使用UIAlertController代替UIAlertView。在任何情况下,所有技术都依赖于使用某些版本的iOS,而且我发现它们非常不可靠。

我现在使用的是一个单例,用于跟踪显示的警报数量。单例有一个方法可以返回当前显示的警报数,一个添加一个的方法,一个减去一个的方法。

通过在呈现UIAlertController

时向单例添加一个来实现
[self presentViewController:alert animated:YES completion:^(){
        AlertSingleton *muhInstance = [AlertSingleton sharedInstance];
        [muhInstance addOne];
        //Anything else for completion
    }];

然后使用您添加到警报的每个可能的操作选项减去一个,如下所示:

UIAlertAction *myAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
        AlertSingleton *muhInstance = [AlertSingleton sharedInstance];
        [muhInstance removeOne];

        //Any Other alert actions
    }];

现在,如果通过检查单身人士中的计数是否大于零来显示警报,您可以知道应用程序中的任何位置:

if ([[AlertSingleton sharedInstance] alertCount] > 0) {
        //There is an alert showing
        //Your code here
    }

我发现此技术对于跟踪警报非常可靠。