2016-05-27 2 views
0

Я пытаюсь создать UIAlertController в AppDelegate для обработки локальных уведомлений на переднем плане. Мой код выглядит следующим образом:Попытка представить UIAlertController на UINavigationController, чей вид отсутствует в иерархии окон

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

Вы должны убедиться, что он находится в основном потоке при изменении пользовательского интерфейса или отображении нового вида. Если у вас возникли странные проблемы, то много времени dispatch_async (dispatch_get_main_queue()) {...} будет исправлять проблемы, связанные с пользовательским интерфейсом. – SeanRobinson159

ответ

2

Таким образом, существует несколько причин, по которым вы можете получить эту ошибку. Я бы предположил, что либо ваш контроллер корневого представления еще не отображается, либо ваш контроллер корневого представления является чем-то вроде UINavigationController, который не должен представлять представления.

Если его последний, то его очень легко исправить, просто отображая его с контроллера верхнего уровня. Так что-то вроде этого, может быть:

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

Вы действительно должны держать подальше от dispatch_async при выполнении этой работы, в первую очередь диспетчерская к чему-либо, кроме основного потока приведет вас в массивную мир боли (операции пользовательского интерфейса могут быть только выполненный по основному потоку) и отправка в конец основной очереди - это плохое решение (если оно вообще будет работать).

+0

Я заменил/скорректировал свой код с вашим предложением, но это не проблема. Я думаю, что это имеет какое-то отношение к тому факту, что мой контроллер корневого представления еще не отображается. Но, на мой взгляд, должен быть способ отображения предупреждения в каждом контроллере представления из приложения из делегата приложения. По крайней мере, это то, что все говорят об обработке уведомления, когда приложение уже запущено. –

+0

Итак, ваша проблема заключается в том, что контроллер вида может представлять только другой контроллер вида. Таким образом, вы можете вызвать presentViewController, когда захотите, если у вас есть ссылка на контроллер представления в иерархии представлений. Итак, каков ваш контроллер корневого представления? Какой тип? – Welton122

+0

Является ли контроллер корневого представления таким же, как контроллер начального представления? Насколько я знаю, только два вида, которые я использовал, являются контроллерами представлений. –

Смежные вопросы

 Смежные вопросы