Frage "Anwendung versucht, modal einen aktiven Controller zu präsentieren"?


Ich bin gerade auf einen Crash gestoßen, als ich einen NSInvalidArgumentException mit dieser Nachricht in einer App, die das vorher nicht gemacht hat.

Anwendung versucht modal einen aktiven Controller zu präsentieren   UITabBarController: 0x83d7f00.

Ich habe ein UITabBarController was ich in der erstellen AppDelegate und gib ihm die Matrix von UIViewControllers.

Eine davon möchte ich modal präsentieren, wenn ich darauf geklickt habe. Ich habe das getan, indem ich die Delegate-Methode implementiert habe

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController

Wenn dieser View-Controller von der Klasse ist, die ich modal präsentieren möchte, gebe ich NO zurück und mache

[tabBarController presentModalViewController:viewController animated:YES];

Und jetzt bekomme ich diesen Fehler, was zu der Annahme führt, dass man einen View-Controller, der irgendwo anders aktiv ist (in der Tableiste ...), nicht modal präsentieren kann. Ich sollte sagen, ich bin auf XCode 4.2 Developer Preview 7, also ist das iOS 5 (Ich weiß über die NDA, aber ich denke, ich gebe keine verbotenen Details). Ich habe derzeit keine XCode-Installation, um zu testen, ob das Kompilieren gegen das iOS4-SDK abstürzt, aber ich bin mir fast sicher, dass das nicht funktioniert.

Ich wollte nur fragen, ob jemand dieses Problem erfahren hat oder einen Vorschlag hat


76
2017-09-15 09:55


Ursprung


Antworten:


Angenommen, Sie haben drei View-Controller wie folgt instanziiert:

UIViewController* vc1 = [[UIViewController alloc] init];
UIViewController* vc2 = [[UIViewController alloc] init];
UIViewController* vc3 = [[UIViewController alloc] init];

Sie haben sie zu einer Tab-Leiste wie folgt hinzugefügt:

UITabBarController* tabBarController = [[UITabBarController alloc] init];
[tabBarController setViewControllers:[NSArray arrayWithObjects:vc1, vc2, vc3, nil]];

Jetzt versuchst du so etwas zu tun:

[tabBarController presentModalViewController:vc3];

Dies führt zu einem Fehler, da dieser Tab Bar Controller den View Controller, den Sie ihm gegeben haben, nicht mehr benutzen kann. Sie können es entweder nicht zum Array der View-Controller auf der Registerkartenleiste hinzufügen oder es nicht modal darstellen.

Apple erwartet, dass Sie ihre UI-Elemente in einer bestimmten Weise behandeln. Dies wird wahrscheinlich in den Human Interface Guidelines irgendwo als "tue das nicht, weil wir nicht erwarten, dass du das jemals tun willst" begraben.


80
2017-09-23 19:44



Ich habe das gleiche Problem. Ich versuche, den View-Controller kurz nach dem Schließen darzustellen.

[self dismissModalViewControllerAnimated:YES];

Wenn ich es ohne Animation versuche, funktioniert es perfekt, und das Problem ist, dass der Controller noch am Leben ist. Ich denke, dass die beste Lösung zu verwenden ist dismissViewControllerAnimated:completion: für iOS5


11
2017-12-06 05:11



Ich hatte dasselbe Problem. Ich löse es. Sie können diesen Code versuchen:

[tabBarController setSelectedIndex:1];
[self dismissModalViewControllerAnimated:YES];

2
2018-04-30 09:49



In meinem Fall habe ich versucht, den ViewController (ich habe die Referenz des ViewControllers im TabBarViewController) von verschiedenen View-Controllern zu präsentieren und es stürzte mit der obigen Nachricht ab. In diesem Fall, um die Präsentation zu vermeiden, können Sie verwenden

viewController.isBeingPresentiert

!viewController.isBeingPresented {
          // Present your ViewController only if its not present to the user currently.
}

Könnte jemandem helfen.


1
2017-07-13 03:50



Einfach entfernen

[tabBarController presentModalViewController:viewController animated:YES];

und behalten

[self dismissModalViewControllerAnimated:YES];

0
2017-10-18 12:59