10 Stimmen

IOS segue doppelt ausgeführt

Ich habe eine Tabellenansicht mit verschiedenen Arten von Tabellenansichtszellen darin. In einer der Zellen befinden sich zwei Schaltflächen, die beim Drücken einen Ansichtscontroller laden. Ich verwende die folgende Funktion, um den Schaltflächen-Druck zu behandeln:

- (IBAction)leftButtonPressed:(id)sender
{
    // Die gedrückte Schaltfläche erhalten
    UIButton *button = (UIButton*)sender;
    // Den Indexpfad erhalten
    NSIndexPath *indPath = [NSIndexPath indexPathForRow:button.tag inSection:0];
    // Laden der richtigen Daten aus meinem Datenspeicher
    NSArray *clickedEvent = [[[SOEventManager sharedEventManager] eventsArray] objectAtIndex:indPath.row];
    [[SOEventManager sharedEventManager] setSelectedEvent:clickedEvent[0]];
    // Alles funktioniert bis zu diesem Punkt wie es sollte
    // Durchführung des Segues...
    [self performSegueWithIdentifier:@"buttonSegue" sender:self];
}

Mein buttonSegue soll einen neuen Ansichtscontroller drücken. Irgendwie wird es stattdessen zweimal gedrückt, sodass ich die folgende Warnung erhalte:

2013-11-27 01:48:30.894 Self-Ordering App[2081:70b] Verschachtelte Push-Animation kann zu einer beschädigten Navigationsleiste führen 
2013-11-27 01:48:31.570 Self-Ordering App[2081:70b] Der Abschluss einer Navigationsübergang in einem unerwarteten Zustand. Der Navigationsleisten-Unterbaum könnte beschädigt werden.

In meinem Fall führt dies zu einem Absturz, da es einen Ereignis gibt, bei dem ich möchte, dass die App sofort den Ansichtscontroller poppt, sodass sie zur Tabellenansicht zurückkehren kann. Ich verwende dafür eine Alertview und behandele das Ereignis wie folgt:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSString *buttonTitle = [alertView buttonTitleAtIndex:buttonIndex];
    // ...
    // Zusätzliche Überprüfung der Schaltflächentitel....
    else if ([buttonTitle isEqualToString:NSLocalizedString(@"Vissza", nil)])
    {
        [self.navigationController popViewControllerAnimated:YES];
    }
}

Es könnte interessant sein zu erwähnen, dass ich einen anderen Segue von meiner "regulären" Tabellenansichtszelle habe und in diesem Fall verwende ich die prepareForSegue: Methode

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"detailSegue"])
    {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        SOEvent *selectedEvent = [[[SOEventManager sharedEventManager] eventsArray] objectAtIndex:indexPath.row];
        [[SOEventManager sharedEventManager] setSelectedEvent:selectedEvent];
    }
}

In diesem Fall wird der Ansichtscontroller perfekt gedrückt und sogar sofort poppt, wenn das erforderlich ist. Ich teste dies auf iOS7 und Xcode 5. Ich habe ein solches Problem noch nie zuvor erlebt, jede Hilfe wäre sehr willkommen.

17voto

Mário Carvalho Punkte 3026

Vielleicht möchten Sie Ihre Segues mit View Controllern anstatt mit UIButtons verbinden!

Sie sollten die Segues wahrscheinlich mit einem Button wie diesem verdrahten: Bildbeschreibung hier eingeben

Aber Sie sollten sie stattdessen mit den View Controllern verbinden: Bildbeschreibung hier eingeben

16voto

József Vesza Punkte 4775

Antwort von can poyrazoglu:

Sind Sie sicher, dass Sie die Aktionen in Interface Builder korrekt verbunden haben? Vielleicht haben Sie das Ereignis für beides, zum Beispiel sowohl touch up inside als auch touch down inside statt nur touch up inside, verkabelt. Oder vielleicht haben Sie den Übergang sowohl im Code als auch erneut im Interface Builder zugewiesen. Haben Sie das überprüft? Das ist ein häufiger Fehler. –

Ich hatte die touch up inside Aktionen für jeden Button sowohl im Storyboard als auch in meinen Methoden des Tableview-Datenquellen zugewiesen.

Vielen Dank für Ihre schnelle Hilfe can poyrazoglu!!

9voto

Für Swift 3, Xcode und iOS 9+ - was ich verwende: Stellen Sie sicher, dass Sie das Segue von Ihren UIViewControllern und nicht von Buttons oder anderen Schnittstellen zeichnen.

Ich hatte das gleiche Problem, und einfach das Starten des Segues vom UIController anstelle des Buttons entfernte diesen Fehler.

3voto

Matthew Zourelias Punkte 534

Ich habe immer dieses Problem, wenn ich meine Schaltflächen direkt mit dem Ziel-View-Controller verbunden habe. Sie müssen sicherstellen, dass Sie zuerst das alte Segue löschen, dann auf den aktuellen View-Controller klicken (von dem Sie kommen) und STRG + Klick auf den Ziel-Controller.

Dies sollte es beheben :)

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