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

1voto

Coder_A_D Punkte 340

Sie müssen unter die Zeile schreiben.

self.searchController.definesPresentationContext = true

anstelle von

self.definesPresentationContext = true

in UIViewController

1voto

Borzh Punkte 4778

Sie können diese Warnung auch erhalten, wenn Sie einen Segue von einem View Controller ausführen, der in einen Container eingebettet ist. Die korrekte Lösung ist die Verwendung von Segue aus dem Parent des Containers, nicht aus dem View-Controller des Containers.

0voto

Gurpreet Singh Punkte 753

Dies funktioniert für jede Ansicht Controller zu präsentieren, wenn Sie Navigation Controller zur Verfügung haben. self.navigationController?.present(MyViewController, animated: true, completion: nil) Außerdem kann ich auch Benachrichtigungen und Mail-Controller anzeigen.

0voto

Naveed Abbas Punkte 1161

Die Meldung erscheint als Warnung und manchmal funktioniert der Code nicht. (!Needs Citation: Neuere SDKs haben möglicherweise strenge Regeln).

Ich habe es für mehr als einen Grund, meist komplizierte Viewcontroller-Szenarien begegnet. Hier ist ein Beispiel.

Scenario: MainViewController (responsible to load: ViewControllerA & ViewControllerB)

Gegenwart ViewControllerA de MainViewController und ohne die Ablehnung der ViewControllerA Sie versuchen zu präsentieren viewControllerB de MainViewController (unter Verwendung einer Delegiertenmethode).

In diesem Szenario müssten Sie sicherstellen, dass Ihr ViewControllerA entlassen wird und dann der ViewControllerB aufgerufen wird.

Denn nach der Präsentation von ViewControllerA (ViewControllerA wird für die Anzeige von Ansichten und Viewcontrollern verantwortlich und wenn MainViewController versucht, einen anderen Viewcontroller zu laden, weigert er sich, mit einer Warnung zu arbeiten).

0voto

Dannie P Punkte 4324

Wenn andere Lösungen aus irgendeinem Grund nicht gut aussehen, können Sie immer noch diese gute alte workaround mit einer Verzögerung von 0 zu präsentieren, etwa so:

dispatch_after(0, dispatch_get_main_queue(), ^{
    finishViewController *finished = [self.storyboard instantiateViewControllerWithIdentifier:@"finishViewController"];
    [self presentViewController:finished animated:NO completion:NULL];    
});

Ich habe zwar keine dokumentierte Garantie dafür gesehen, dass Ihr VC zum Zeitpunkt der Ausführung des Dispatch-Blocks in der View-Hierarchie ist, aber ich habe beobachtet, dass es gut funktionieren würde.

Die Verwendung einer Verzögerung von z. B. 0,2 Sekunden ist ebenfalls eine Option. Und das Beste - auf diese Weise müssen Sie sich nicht mit booleschen Variablen in viewDidAppear:

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