2016-05-27 44 views
0

我试图在AppDelegate中创建一个UIAlertController来处理我的前台本地通知。我的代码如下所示:尝试在其视图不在窗口层次结构中的UINavigationController上呈现UIAlertController

func application(application: UIApplication, didReceiveLocalNotificationnotification: UILocalNotification) { 
    let state: UIApplicationState = application.applicationState 
    if state == .Active { 
     let alert: UIAlertController = UIAlertController(title: "test", message: "test", preferredStyle: UIAlertControllerStyle.Alert) 
     self.window?.rootViewController?.presentViewController(alert, animated: true, completion: nil) 

    } 
} 

但后来我得到这个错误:试图提出UIAlertController上的UINavigationController谁的观点是不是在窗口层次

我已经找到了可能的解决方案,但它们不适合我(dispatch_async,创建一个func)。我认为这与'rootviewcontroller'部分有关,但我不知道如何解决它。这可以修复吗?还是有另一种方式来处理在前台的本地通知?

+0

无论何时修改UI或显示新视图,您都需要确保它位于主线程上。如果你有奇怪的问题,很多时候dispatch_async(dispatch_get_main_queue()){...}将解决与UI相关的问题。 – SeanRobinson159

回答

2

所以有几个原因可能会导致此错误。我猜想你的根视图控制器还没有显示出来,或者你的根视图控制器就像UINavigationController,它不应该呈现视图。

如果它的后者那么它真的很容易通过从顶部视图控制器显示来修复。因此,像这样也许:

(self.window?.rootViewController as? UINavigationController)?.topViewController.presentViewController(alert, animated: true, completion: nil) 

你真的应该执行这项工作时,从dispatch_async保持得好远,如先派遣到任何东西,但主线程将让你成为一个痛苦的大规模的世界(UI操作只能是在主线程上执行)和调度到主队列的末尾是一个糟糕的解决方案(如果它可以工作的话)。

+0

我用您的建议替换/调整了我的代码,但这不是问题。我认为这与我的根视图控制器尚未显示的事实有关。但在我看来,应该有一种方法可以在应用程序委托的应用程序中显示每个视图控制器中的警报。至少这就是每个人在应用程序运行时处理通知的说法。 –

+0

所以你的问题在于,视图控制器只能显示另一个视图控制器。因此,只要您在视图层次结构中引用了视图控制器,就可以在任何地方随时调用presentViewController。那么你的根视图控制器是什么?什么样的? – Welton122

+0

根视图控制器是否与初始视图控制器相同?据我所知,我一直使用的唯一两个视图是视图控制器。 –

相关问题