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];

2voto

Alper Punkte 2806

Ich habe das Problem durch Verschieben der start() Funktion innerhalb der dismiss Abschlussblock:

self.tabBarController.dismiss(animated: false) {
  self.start()
}

Start enthält zwei Aufrufe an self.present() einen für einen UINavigationController und einen weiteren für einen UIImagePickerController .

Damit ist das Problem für mich gelöst.

1voto

Peter Lapisu Punkte 19050

Mauersegler 5

Ich nenne die Gegenwart in viewDidLayoutSubviews wie präsentiert in viewDidAppear verursacht einen Sekundenbruchteil, in dem der View-Controller angezeigt wird, bevor das Modal geladen wird, was wie ein hässlicher Glitch aussieht

Sicherstellen, dass das Vorhandensein des Fensters geprüft und der Code nur einmal ausgeführt wird

var alreadyPresentedVCOnDisplay = false

override func viewDidLayoutSubviews() {

    super.viewDidLayoutSubviews()

    // we call present in viewDidLayoutSubviews as
    // presenting in viewDidAppear causes a split second showing 
    // of the view controller before the modal is loaded

    guard let _ = view?.window else {
        // window must be assigned
        return
    }

    if !alreadyPresentedVCOnDisplay {
        alreadyPresentedVCOnDisplay = true
        present(...)
    }

}

1voto

Tim MB Punkte 4177

Ich habe diesen Fehler gefunden, nachdem ich Xcode aktualisiert habe, ich glaube, um Mauersegler 5 . Das Problem trat auf, wenn ich programmatisch eine Segue direkt nach dem Abwickeln eines View-Controllers startete.

Die Lösung ergab sich aus der Behebung eines damit zusammenhängenden Fehlers, nämlich dass der Benutzer nun in der Lage war, Übergänge durch Wischen nach unten auf der Seite rückgängig zu machen. Dies brach die Logik meines Programms.

Das Problem wurde behoben, indem der Präsentationsmodus für alle View-Controller von Automatisch a Vollbild .

Sie können dies im Attribute-Panel im Interface Builder tun. Oder siehe diese Antwort wie man das programmatisch macht.

1voto

Mocha Punkte 1912

Dies ist mir passiert, als ich versucht habe, auf meinem navigationController zu präsentieren, wenn seine Ansicht noch nicht in der Ansichtshierarchie präsentiert wurde. Der Weg, wie ich das gelöst habe, ist auf die Die didShow-Methode des NavigationControllerDelegate . Sobald die didShow-Methode aufgerufen wird, weiß ich, dass ich auf meinem navigationController präsentieren kann.

Hinweis: Mit dispatchQueueAsync.await(.now()) { //present } funktioniert zwar, ist aber umständlich und fehleranfällig, wenn die Ansicht lange braucht, um in der Ansichtshierarchie angezeigt zu werden.

1voto

daj mi spokój Punkte 228
    let alert = UIAlertController(title: "", message: "YOU SUCCESSFULLY\nCREATED A NEW\nALERT CONTROLLER", preferredStyle: .alert)
    func okAlert(alert: UIAlertAction!)
    {

    }
    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: okAlert))

    let scenes = UIApplication.shared.connectedScenes
    let windowScene = scenes.first as? UIWindowScene
    let window = windowScene?.windows.first
    var rootVC = window?.rootViewController

    if var topController = rootVC
    {
        while let presentedViewController = topController.presentedViewController
        {
            topController = presentedViewController
        }
        rootVC = topController
    }
    rootVC?.present(alert, animated: true, completion: nil)

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