4 Stimmen

Die Anwendung hat versucht, modal einen aktiven Controller anzuzeigen: UINavigationController

Ich stoße auf ein Problem, bei dem ein Fehler nur gelegentlich auftritt. Tatsächlich scheint es fast zufällig zu sein. Hier ist, was passiert, ich starte einen Modalansichtscontroller mit dem folgenden Code:

- (void)createMessageClicked
{
    UIStoryboard *sb = [UIStoryboard storyboardWithName="Channel" bundle:nil];
    UINavigationController *nav = [sb instantiateViewControllerWithIdentifier="HIComposeMessageNavController"];
    HIComposeMessageViewController *vc = [[nav viewControllers]objectAtIndex:0];

    vc.channel = [self.channels objectAtIndex:0];
    [self.navigationController presentViewController:nav animated:YES completion:nil];
}

Meistens funktioniert das gut. Aber ab und zu stürzt die App ab und wirft den Fehler "Anwendung hat versucht, modellartig einen aktiven Controller zu präsentieren. Irgendwelche Ideen, was ich hier falsch mache?

7voto

Steve Punkte 1840

Versuche, den Controller zu instanziieren, der in deinem Navigationscontroller in deinem Storyboard eingebettet ist, und erstelle dann eine neue Instanz eines generischen Navigationscontrollers:

HICompseController *controller = [sb instantiateViewController: 
                                  HIComposeMessageViewController];
UINavigationController *nav = [[UINavigationController alloc]
                               initWithRootViewController:controller];
[self presentViewController:nav animated:YES completion:nil];

1voto

Unheilig Punkte 15992

Ich würde vorschlagen, ein ivar für Ihren UINavigationController festzulegen, weil jedes Mal, wenn die Aktion ausgelöst wird, Sie einen ganz neuen Navigationscontroller erstellen und diesen modal präsentieren.

Ich vermute, dass dies häufiger auftritt, wenn die Zeit zwischen Klickaktionen nah beieinander liegt, also nachdem der modale Controller abgelehnt wurde, aber nicht genügend Zeit hatte, bevor ein neuer Navigationscontroller aus derselben Klasse instanziiert wird und erneut modal präsentiert wird. Durch die Verwendung desselben Navigationscontrollers können Sie zumindest sicher sein, dass er abgelehnt wird, bevor er erneut über diese Methode präsentiert wird.

Versuchen Sie, ein ivar für den Navigationscontroller zu erstellen und diesen jedes Mal in dieser Methode wiederzuverwenden.

-1voto

Patty Punkte 1

Dies hat für mich funktioniert:

if let presented = self.presentedViewController,
   !presented.isBeingPresented {
   self.present(navController, 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