2016-05-27 9 views
0

私は、前景ローカル通知を処理するためにAppDelegateでUIAlertControllerを作成しようとしています。私のコードは次のようになります。UIAavigationControllerをウインドウ階層に表示しないUIAavigationControllerに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) 

    } 
} 

しかし、私はこのエラーを取得する:そのビューウィンドウ階層ではありませんUINavigationControllerにUIAlertControllerを提示する試みを。

私はすでに解決策を見つけましたが、私のためには機能しません(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) 

あなたは本当に(UI操作のみできますが、痛みの大規模な世界に入るだろう、離れdispatch_asyncからも維持する必要がありますメインスレッド上で実行されます)、メインキューの最後にディスパッチするのは悪い解決策です(まったく動作する場合)。

+0

私のコードをあなたの提案に置き換えましたが、それは問題ではありません。私はそれが私のルートビューコントローラがまだ表示されていないという事実と関係があると思います。しかし、私の意見では、アプリケーションの代理人からアプリからすべてのビューコントローラにアラートを表示する方法があるはずです。少なくとも、これは、アプリが既に動作しているときに誰もが通知を処理すると言っていることです。 –

+0

ここで問題となるのは、View Controllerは別のView Controllerのみを表示できることです。したがって、ビュー階層内のビューコントローラへの参照があれば、好きなときにpresentViewControllerを呼び出すことができます。だからあなたのルートビューコントローラは何ですか?どんなタイプ? – Welton122

+0

ルートビューコントローラは初期ビューコントローラと同じですか?私が使用している唯一の2つのビューは、View Controllerです。 –

関連する問題