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

1413voto

James Bedford Punkte 28023

Von wo aus rufen Sie diese Methode auf? Ich hatte ein Problem, bei dem ich versucht habe, einen modalen View-Controller innerhalb der viewDidLoad Methode. Die Lösung für mich war, diesen Aufruf in die viewDidAppear: Methode.

Meine Vermutung ist, dass die Ansicht des View-Controllers ist nicht in der Ansichtshierarchie des Fensters an dem Punkt, an dem es geladen wurde (wenn die viewDidLoad Nachricht gesendet wird), aber es ist in der Fensterhierarchie, nachdem es präsentiert wurde (wenn die viewDidAppear: Nachricht gesendet wird).


Vorsicht

Wenn Sie einen Anruf tätigen bei presentViewController:animated:completion: im viewDidAppear: können Sie auf ein Problem stoßen, bei dem der modale View-Controller immer dann angezeigt wird, wenn die Ansicht des View-Controllers erscheint (was durchaus sinnvoll ist!), so dass der modale View-Controller, der angezeigt wird, nie verschwindet...

Vielleicht ist dies nicht der beste Ort, um den modalen View-Controller zu präsentieren, oder vielleicht muss ein zusätzlicher Zustand beibehalten werden, der es dem präsentierenden View-Controller ermöglicht zu entscheiden, ob er den modalen View-Controller sofort präsentieren soll oder nicht.

72voto

Chris Nolet Punkte 8347

Eine weitere mögliche Ursache:

Ich hatte dieses Problem, als ich versehentlich denselben View-Controller zweimal präsentierte (einmal mit performSegueWithIdentifer:sender: die aufgerufen wurde, als die Taste gedrückt wurde, und ein zweites Mal mit einem Segue, der direkt mit der Taste verbunden war).

Tatsächlich wurden zwei Segues gleichzeitig abgefeuert, und ich bekam den Fehler: Attempt to present X on Y whose view is not in the window hierarchy!

39voto

Jonny Punkte 15299

viewWillLayoutSubviews y viewDidLayoutSubviews (iOS 5.0+) können zu diesem Zweck verwendet werden. Sie werden früher als viewDidAppear aufgerufen.

28voto

abdul sathar Punkte 2321

Um eine Unteransicht in der Hauptansicht anzuzeigen, verwenden Sie bitte folgenden Code

UIViewController *yourCurrentViewController = [UIApplication sharedApplication].keyWindow.rootViewController;

while (yourCurrentViewController.presentedViewController) 
{
   yourCurrentViewController = yourCurrentViewController.presentedViewController;
}

[yourCurrentViewController presentViewController:composeViewController animated:YES completion:nil];

Für Dismiss jede Unteransicht von Hauptansicht, Bitte verwenden Sie folgenden Code

UIViewController *yourCurrentViewController = [UIApplication sharedApplication].keyWindow.rootViewController;

while (yourCurrentViewController.presentedViewController) 
{
   yourCurrentViewController = yourCurrentViewController.presentedViewController;
}

[yourCurrentViewController dismissViewControllerAnimated:YES completion:nil];

19voto

sunkehappy Punkte 8704

Ich bin auch auf dieses Problem gestoßen, als ich versucht habe, eine UIViewController en viewDidLoad . Die Antwort von James Bedford hat funktioniert, aber meine App zeigte zuerst für 1 oder 2 Sekunden den Hintergrund an.

Nach einigen Nachforschungen habe ich eine Lösung für dieses Problem gefunden, indem ich die addChildViewController .

- (void)viewDidLoad
{
    ...
    [self.view addSubview: navigationViewController.view];
    [self addChildViewController: navigationViewController];
    ...
}

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