672 Stimmen

Versuch, einen UIViewController auf einem UIViewController zu präsentieren, dessen Ansicht sich nicht in der Fensterhierarchie befindet

Ich habe gerade begonnen, Xcode 4.5 zu verwenden, und ich habe diesen Fehler in der Konsole:

Warnung: Versuch, < finishViewController: 0x1e56e0a0 > auf < ViewController: 0x1ec3e000> zu präsentieren, dessen View nicht in der Windowshierarchie ist!

Die Ansicht wird immer noch angezeigt und alles in der App funktioniert einwandfrei. Ist das etwas Neues in iOS 6?

Dies ist der Code, den ich verwende, um zwischen den Ansichten zu wechseln:

UIStoryboard *storyboard = self.storyboard;
finishViewController *finished = 
[storyboard instantiateViewControllerWithIdentifier:@"finishViewController"];

[self presentViewController:finished animated:NO completion:NULL];

5voto

Adam Johns Punkte 33769

Mein Problem war, dass ich die Überleitung in UIApplicationDelegate 's didFinishLaunchingWithOptions Methode, bevor ich die makeKeyAndVisible() am Fenster.

4voto

MarekB Punkte 452

Ich habe diesen Fehler behoben, indem ich den obersten Viewcontroller in einer Konstante gespeichert habe, die beim Durchlauf über den RootViewController gefunden wird:

if var topController = UIApplication.shared.keyWindow?.rootViewController {
    while let presentedViewController = topController.presentedViewController {
        topController = presentedViewController
    }
    topController.present(controller, animated: false, completion: nil)
    // topController should now be your topmost view controller
}

4voto

Red Punkte 1415

Ich hatte das gleiche Problem. Das Problem war, die performSegueWithIdentifier wurde durch eine Benachrichtigung ausgelöst, sobald ich die Benachrichtigung auf den Haupt-Thread setzen die Warnmeldung war weg.

4voto

caglar Punkte 160

In diesem Block können Sie Ihre Segues oder Present-, Push-Codes aufrufen:

override func viewDidLoad() {
    super.viewDidLoad()
    OperationQueue.main.addOperation {
        // push or present the page inside this block
    }
}

4voto

igraczech Punkte 2246

Ich habe mit einem solchen Code, der endlich funktioniert zu mir (Swift), wenn man einige anzeigen möchten beendet viewController von praktisch überall aus. Dieser Code wird natürlich abstürzen, wenn kein RootViewController verfügbar ist, das ist das offene Ende. Er beinhaltet auch nicht den normalerweise erforderlichen Wechsel zum UI-Thread mit

dispatch_sync(dispatch_get_main_queue(), {
    guard !NSBundle.mainBundle().bundlePath.hasSuffix(".appex") else {
       return; // skip operation when embedded to App Extension
    }

    if let delegate = UIApplication.sharedApplication().delegate {
        delegate.window!!.rootViewController?.presentViewController(viewController, animated: true, completion: { () -> Void in
            // optional completion code
        })
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X