"Anwendung versucht, einen aktiven Controller modal darzustellen"?

100

Ich bin gerade auf einen Absturz gestoßen, der eine NSInvalidArgumentExceptionMeldung mit dieser Meldung in einer App zeigt, die dies zuvor noch nicht getan hat.

Die Anwendung hat versucht, einen aktiven Controller UITabBarController: 0x83d7f00 modal darzustellen.

Ich habe eine , UITabBarControllerdie ich in der erstellen AppDelegateund geben ihm die Anordnung von UIViewControllers.

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

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

Wenn dieser Ansichtscontroller zu der Klasse gehört, die ich modal präsentieren möchte, gebe ich NO zurück und tue dies

[tabBarController presentModalViewController:viewController animated:YES];

Und jetzt erhalte ich diesen Fehler, was zu bedeuten scheint, dass Sie einen View Controller, der an einer anderen Stelle aktiv ist (in der Registerkartenleiste ...), nicht modal darstellen können. Ich sollte also sagen, dass ich auf XCode 4.2 Developer Preview 7 bin Dies ist iOS 5 (ich weiß über die NDA Bescheid, aber ich glaube, ich gebe keine verbotenen Details). Ich habe derzeit keine XCode-Installation, um zu testen, ob dies beim Kompilieren mit dem iOS4 SDK abstürzt, aber ich bin mir fast sicher, dass dies nicht der Fall ist.

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

Javier Soto
quelle
Vor iOS 5 hat dies keine Ausnahme ausgelöst, aber nichts zurückgegeben. Ab iOS 5 löst dieser Befehl eine Ausnahme aus.
Frédéric Adda

Antworten:

103

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

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

Sie haben sie einer Registerkartenleiste wie der folgenden hinzugefügt:

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

Jetzt versuchen Sie so etwas zu tun:

[tabBarController presentModalViewController:vc3];

Dies gibt Ihnen einen Fehler, da dieser Tab Bar Controller den von Ihnen angegebenen View Controller im Griff hat. Sie können es entweder nicht zum Array der Ansichtssteuerungen in der Registerkartenleiste hinzufügen oder nicht modal darstellen.

Apple erwartet von Ihnen, dass Sie die Elemente der Benutzeroberfläche auf bestimmte Weise behandeln. Dies ist wahrscheinlich irgendwo in den Human Interface Guidelines als "Tu das nicht, weil wir nicht erwarten, dass du das jemals tun willst" vergraben.

lswank
quelle
6
Die Sache ist, dass dies vor iOS 5 absolut kein Problem war, daher meine Sorge! Ich habe der Registerkarte einen Dummy-UIViewController hinzugefügt und die tatsächliche Instanz der View Controller-Unterklasse modal dargestellt.
Javier Soto
1
@Iswank, jetzt in iOS 6, um die Dinge "einfacher" zu machen, haben sie den PresentModalViewController veraltet und alle Arten von Rotationsproblemen verursacht. Sie müssen den PresentViewController verwenden: animiert: Fertigstellung und Überprüfung, wie Ihre App mit den Änderungen
umgeht
15

Ich habe das gleiche Problem. Ich versuche, den View Controller direkt nach dem Entlassen zu präsentieren.

[self dismissModalViewControllerAnimated:YES];

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

Danil
quelle
Es schlägt fehl, wenn Sie es animiert schließen, da es zu dem Zeitpunkt, an dem Sie den Modal View Controller erneut präsentieren möchten, immer noch modal auf dem Bildschirm angezeigt wird und entfernt wird.
Pascal
2
Es ist in IOS 6.0
Sumit Kumar Saha
12

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

viewController.isBeingPresented

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

Könnte jemandem helfen.

Karthick Ramesh
quelle
Es funktioniert nur in viewWillappperar, aber wenn ich es überprüft habe, bevor ich den bereits präsentierten viewController präsentiere, wird immer false zurückgegeben.
Guru
1
Ich arbeite nicht für mich. Bekommt immer noch App-Absturz. (! viewController.presentingViewController) Problem behoben.
Argus
3

Ich hatte das gleiche Problem. Ich löse es. Sie können diesen Code ausprobieren:

[tabBarController setSelectedIndex:1];
[self dismissModalViewControllerAnimated:YES];
Erhan Demirci
quelle
2

Der gleiche Problemfehler ist mir passiert, als ich versucht habe, presenteinen untergeordneten Ansichtscontroller anstelle seines UINavigationViewControllerübergeordneten zu verwenden

Nik
quelle
0

Einfach entfernen

[tabBarController presentModalViewController:viewController animated:YES];

und behalten

[self dismissModalViewControllerAnimated:YES];
user170317
quelle
Dies gibt eine veraltete Warnung ... Was ist also eine Alternative dazu?
Kirtikumar A.
Hier habe ich [blockSelf EntlassungViewControllerAnimated: YES Vervollständigung: Null] verwendet;
Kirtikumar A.
0

Anstatt zu verwenden:

self.present(viewControllerToPresent: UIViewController, animated: Bool, completion: (() -> Void)?)

Sie können verwenden:

self.navigationController?.pushViewController(viewController: UIViewController, animated: Bool)
Wimukthi Rajapaksha
quelle