2016-12-25 8 views
3

Проблема в большинстве вопросов, подобных этому, заключается в том, что present вызывается до viewDidAppear. Это не причина.Предупреждение: попытка представить UIAlertController на UISplitViewController, чей вид отсутствует в иерархии окон

Это приложение не использует раскадровки NIB, и все операции являются программными.

Окно приложения UISplitViewController. Контроллеры представлений с разделенным представлением устанавливаются в массив из двух UINavigationController с. Контроллер детского вида затем представляет собой контроллер вида. Проблема заключается в том, что UIAlertController s, представленный делегатом приложения, не будет отображаться, пока модуль представления отображается в виде модально. Он работает иначе.

Как я пытаюсь представить:

window?.rootViewController?.present(alert, animated: true, completion: nil) 

Я получаю эту ошибку:

Attempt to present UIAlertController on UISplitViewController whose view is not in the window hierarchy 

ответ

2

Чтобы решить эту проблему, я ставлю эту функцию в моем приложении делегата.

// Utility function to avoid: 
// Warning: Attempt to present * on * whose view is not in the window hierarchy! 
func showAlertGlobally(_ alert: UIAlertController) { 
    let alertWindow = UIWindow(frame: UIScreen.main.bounds) 
    alertWindow.windowLevel = UIWindowLevelAlert 
    alertWindow.rootViewController = UIViewController() 
    alertWindow.makeKeyAndVisible() 
    alertWindow.rootViewController?.present(alert, animated: true, completion: nil) 
} 
+1

Совершенно аналогичное решение было предложено здесь: http://stackoverflow.com/a/34487871/1187415 для Swift 3 здесь: http://stackoverflow.com/a/40401936/1187415. –