2013-11-25 4 views
5

Ich habe gerade ein Problem mit einer App gefunden, die ich getestet habe. Ich war mein Kopf an die Wand hämmern zu verstehen, warum ich diesen Fehler habe:Verschachtelte Push-Animationen iOS7 Bug?

2013-11-25 09:02:55.687[186:60b] nested push animation can result in corrupted navigation bar 
2013-11-25 09:02:56.055[186:60b] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted. 
2013-11-25 09:02:57.666[186:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't add self as subview' 

Nach einer Weile habe ich ein neues Projekt erstellt, um zu versuchen, den Fehler zu reproduzieren:

Diese happends, wenn ich auf zwei andrücken Bar-Button-Elemente mit verschiedenen Übergängen, und dann zur gleichen Zeit freigeben. Ich benutze Storyboards mit Überschriften und habe KEINE selbstgeschriebenen Codes. Ist das ein iOS7 Bug, oder fehlt mir etwas?

ich nicht in der Lage gewesen, auf Simulator zu reproduzieren, da ich ... Ich weiß nicht zwei Cursor hat bin mit einem iPad2 mit iOS7 7.0.3

Bild von Storyboard:

enter image description here

EDIT:

Da ich und ganz ohne Downvoted niemand zertrümmert wurde sogar diesen Fehler zu reproduzieren und bestätigen zu versuchen, habe ich es ohne Bestätigung gemeldet.

EDIT2:

Apfel bat um einen Stack-Trace. Aber da ich ihnen die genauen Schritte zur Reproduktion gegeben habe, habe ich mich nicht darum gekümmert. Es ist nicht meine Aufgabe. Also zögern Sie nicht, dies zu melden.

+0

Wie wird es die Fehler erzeugen, wenn Sie versuchen, auf eine Schaltfläche klicken – codercat

+0

Ich drücke beide Bar-Taste Elemente, halten Sie sie gedrückt. und gleichzeitig freigeben. – ullstrm

+0

Dies ist keine Programmierfrage und sollte wirklich auf den Apple Boards oder in einem Radar sein, wenn Sie glauben, dass es ein Bug ist. – Fogmeister

Antwort

0

Es ist wahrscheinlich, weil Sie zwei Segmente gleichzeitig aufrufen und wenn Sie die Tasten loslassen, versucht die App, ein Segment aufzurufen, bevor das andere Segment beendet ist.

Also, was ich sehen kann, ist, dass die Warnung, die Xcode präsentiert, ist, weil einer Ihrer View-Controller vom Segment ausgelöst wird und das andere Segment für den anderen View-Controller ausgelöst wird, ohne auf das Ladeende des ersten View-Controllers zu warten .

Sie können versuchen, bool oder eine Art Controller zu setzen, der prüft, wann der erste View-Controller geladen wurde, und dann den anderen Abschnitt auslöst, wenn Sie wissen, dass der erste View-Controller korrekt geladen wurde.

+0

Ja, ich führe die Übergänge jetzt manuell mit meinem eigenen booleschen Flag durch, um zu überprüfen, ob es sicher ist oder nicht. Apple geht Buggy-Code. Warum ermutigen sie uns, Storyboard-Übergänge zu verwenden, wenn sie fehlerhaft sind? – ullstrm

+1

Die meisten Probleme und Bugs, die ich beim Programmieren mit dem Apple-Entwickler-Tool angetroffen habe, sind zu 99,9% meiner Zeit meine eigene Schuld, daher kann ich Xcode-Fehler nicht wirklich kommentieren. – Oskariagon

+0

Und genau deshalb Ich habe dies hier gepostet, um zu sehen, ob jemand anderes reproduzieren könnte, BEVOR man einen Fehlerbericht über Apple veröffentlicht. – ullstrm

0

ich das gleiche Problem in meiner App bekommen indem Sie folgendermaßen vorgehen: 1 Login (segue mit Animation ausgeführt) 2 schnell auf eine große Auswahl an neuen Bildschirm machen (startet ein weiteres segue)

wenn Sie versuchen, Führen Sie einen Übergang durch, bevor die vorherige Transitionsanimation abgeschlossen wurde. Also fügte ich eine Verzögerung hinzu, bevor ich das Segment ausführte und es schien, es zu reparieren. aber ich denke nicht, dass dies eine endgültige Lösung ist, da die Dauer der Animation variieren kann, je nachdem, wie schnell das Gerät ist.

Ich denke, die beste Lösung wäre, den Übergang AFTER viewDidAppear auszulösen.

0

Ich habe gerade so etwas implementiert und es funktioniert jetzt.

So habe ich View-Controller A, B & C. Normalerweise Benutzer können von A nach B und von B nach C navigieren, aber jetzt habe ich eine Möglichkeit geschaffen, die Benutzer von A nach C (durch B) automatisch navigieren können.

Was ich getan habe, war eine öffentliche Methode in B zu schaffen, die sagt, C zu drücken.Diese Methode sieht so aus:

- (void)pushC { 
    if ([self isViewLoaded] && self.navigationController.visibleViewController == self && ![self isBeingPresented] && self.didViewAppear) { 
     [self performSegueWithIdentifier:@"CSegue" sender:self]; 
    } 
    else { 
     [self performSelector:@selector(pushC) withObject:nil afterDelay:0.4f]; 
    } 
} 

Alles schon auf Sie abgesehen von dieser didViewAppear Eigenschaft gegeben ist. Diesen habe ich auf - viewDidAppear auf true gesetzt.

Dann muss ich nur - pushC auf der - prepareForSegue Methode in View Controller A aufrufen. Wie wir gesehen haben, wird er auf den richtigen Zeitpunkt warten, um tatsächlich das nächste Segment aufzurufen.

Das funktioniert gut, aber zeigt alle Navigationsübergänge, die ich nicht brauche. Ich würde es vorziehen, einen Baum in den Navigationscontroller zu schieben, so dass ich nur eine Transitionsnavigation hätte. Nun, ich denke, ich muss später auf dieses Ding zurückkommen.

Dies gesagt, ich glaube nicht, dass es ein Fehler ist, sondern tatsächlich eine Verhaltensänderung in iOS7, weil die Animation länger wurde.