Die Konsequenzen der Schlechten Programmierung: dismissViewController vs popViewController
Verstehe ich den Unterschied zwischen dismissViewControllerAnimated:completion:
und popViewControllerAnimated:
wie beschrieben auf Stack Overflow und hier:
-dismissViewControllerAnimated:completion:
- Methode wird verwendet, um zu schließen
ein UIViewController, die war vorgestellt durch die Methode:
-presentViewController:animated:completion:
.
-popViewControllerAnimated:
Methode der UINavigationController verwendet wird
pop-controller angezeigt, die durch-pushViewController:animated
Methode
UINavigationController.
Ich vor kurzem einen Fehler in meiner app, wo ich war mit [self dismissViewControllerAnimated:completion:]
zu entlassen, VC, dass vorgestellt wurde mit einem Stoß in eine navigation eingebettet app. Ich die Pommes, als hätte ich pizza hatte. Ich habe nicht fangen die Fehler, weil alles geklappt hat und meine VC-wurde aufgehoben, wie erwartet.
Meine Frage: Was sind die Folgen der Vermischung dieser beiden Methoden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
-presentViewController:animated:completion:
und-pushViewController:animated:
unterschiedliche Dinge bedeuten. Die erstere sagt "zeigen Sie diese anderen view-controller so wie selbst ersetzen". Der letztere sagt, "zeigen Sie das anderen view-controller in sich selbst, als Teil der Liste sind Sie controlling".Also es geht darum, wer ist betrachtet zu werden, in der die Anzeige nach dem übergang. Im ersten Fall werden die navigation-controller übergibt die Kontrolle. Im letzteren behält er die Kontrolle.
Die ehemalige Funktionalität wird von
UIViewController
. Letzteres ist spezifisch fürUINavigationController
.Da die beiden Aktionen sind ganz anders, das Gegenteil die Aktionen voneinander getrennt sind. Navigation-Controller fangen konnte
dismissViewController:...
und überprüfen, wie der controller namens vorgestellt wurde, Verzweigung entweder in der Oberklasse oder inpop...
aber die Verschmelzung von Aufgaben wäre unsympathisch aus einem design und einem Wartungs Sicht.Da der navigation-controller nicht Versprechen, zum anzeigen der einen Sache zur anderen, und
UIViewController
nicht Versprechen, insbesondere Verhalten, wenn der controller übergeben Sie nicht vorher schon präsentiert, ich denke, dass die wörtliche Antwort auf deine Frage ist: die Folge der Vermischung dieser beiden Dinge ist Undefiniertes Verhalten.Ich bin nicht sicher, ob ich das erklären kann, die besten, die ich möchte, aber lassen Sie mich versuchen.
Arbeite ich an ein Tab-Basierte app jetzt, und jeder Reiter hat seine eigene navigation-controller. Für die Seite features, ich habe einen barbuttonitem auf der navbar verzweigen sich zu einem modalen view (und in einigen Fällen von einer modalen zu einer Marke neue navigation-controller zur Steuerung des backstack für die bestimmte Funktion, die den Pfad.
Nenne ich dismissViewController auf der root-Blick auf einen navigation-controller, starte ich von einem anderen als modal. (Ich hoffe, das macht Sinn.)
Vielleicht ist das besser:
Der Darstellung view controller ist verantwortlich für die Entlassung view-controller vorgestellt. Wenn Sie diese Methode aufrufen, auf die vorgestellten view-controller selbst, wird es automatisch leitet die Nachricht an die Darstellung view controller.
Wenn Sie mehrere view-Controller in der Folge also ein stack vorgestellt view-Controller, den Aufruf dieser Methode in einer view-controller in den unteren Stapel entlässt seine unmittelbar untergeordneten view-controller und alle view-Controller vor, das Kind auf dem Stapel. Wenn dies geschieht, nur die oberste Sicht ist entlassen in einer animierten Mode; keine intermediate-view-Controller sind einfach vom stack entfernt. Die oberste Sicht ist entlassen, mit Ihren modal transition-Stil, die unterscheiden sich möglicherweise von den verwendeten Formatvorlagen durch andere view-Controller unten im Stapel.
Push für die navigation based view-Controller, und verwenden Sie popViewController, wenn nötig. Modal einzuführen, etwas, dass zweigt von der navigation und Nutzung dismissViewController als nötig in diesem Fall.