Я полагаю, вы вызываете этот фрагмент кода из приложенияDidFinishLunchingWithOptions:. Я попробовал это на самом деле, потому что должен был. Дело в том, что то, что вы пытаетесь сделать, является правильным, но ViewController, который AppDelegate делает и представляет, должен быть помещен на экран, и до этого фрагмент кода пытается создать alertView и вставить поверх существующего представления RootViewController.
Что бы я сделал, это переместить его на другой вызов делегата, который, как гарантируется, будет вызываться после представления RootViewController.
func applicationDidBecomeActive(application: UIApplication) {
//This method is called when the rootViewController is set and the view.
// And the View controller is ready to get touches or events.
var alert = UIAlertController(title: "Alert", message: "Cannot connect to :", preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil))
self.window?.rootViewController?.presentViewController(alert, animated: true, completion: nil)
}
Но как всегда известно об ответственности AppDelegate. Он предназначен для обработки вызовов и событий делегатов на протяжении всего жизненного цикла приложения и приложений. Если ввод кода здесь имеет смысл, тогда сделайте это. Но если вам будет лучше помещать код в rootViewController или другие части, тогда подумайте об этом.
В любом случае, надеюсь, что это поможет. Ура!
В 'AppDelegate', так описывает ошибку, иерархия окна еще не создан, поэтому оттуда вы можете нет ничего (в по крайней мере, из 'didFinishedLaunchingWithOptions'), поэтому вы должны переместить свой код в' ViewController' –
@ DánielNagy, который я вижу, но я должен показать его из AppDelegate. Разве нет решений? –
Возможный дубликат [чей вид не находится в иерархии окон] (http://stackoverflow.com/questions/11862883/whose-view-is-not-in-the-window-hierarchy) –