Ich möchte eine App mit a erstellen UINavigationController
, um die nächsten Ansichts-Controller zu präsentieren. Mit iOS5 gibt es eine neue Methode zur Präsentation UIViewControllers
:
presentViewController:animated:completion:
Jetzt frage ich mich, warum es keinen Completion-Handler gibt UINavigationController
. Es gibt nur
pushViewController:animated:
Ist es möglich, meinen eigenen Completion-Handler wie den neuen zu erstellen presentViewController:animated:completion:
?
viewDidAppear:animated:
Sie können jedes Mal Code ausführen, wenn Ihr View-Controller auf dem Bildschirm angezeigt wird (viewDidLoad
nur beim ersten Laden Ihres View-Controllers)-(void)viewDidAppear:(BOOL)animated
Antworten:
In der Antwort von par finden Sie eine weitere und aktuellere Lösung
UINavigationController
Animationen werden mit ausgeführtCoreAnimation
, daher wäre es sinnvoll, den Code darin zu kapselnCATransaction
und so einen Abschlussblock festzulegen.Swift :
Für schnell schlage ich vor, eine Erweiterung als solche zu erstellen
Verwendung:
Ziel c
Header:
Implementierung:
quelle
pushViewController:animated:
oderpopViewController:animated
die AufrufeviewDidLoad
undviewDidAppear
in nachfolgenden Runloop-Zyklen auftreten. Mein Eindruck ist also, dass diese Methoden, selbst wenn sie Animationen aufrufen, nicht Teil der im Codebeispiel angegebenen Transaktion sind. War das dein Anliegen? Weil diese Lösung fabelhaft einfach ist.didShowViewController
. Während diese Lösung fantastisch einfach ist, würde ich ihre "Zukunftssicherheit" in Frage stellen. Besonders angesichts der Änderungen beim Anzeigen von Lebenszyklus-Rückrufen, die mit ios7 / 8iOS 7+ Swift
Swift 4:
EDIT: Ich habe eine Swift 3-Version meiner ursprünglichen Antwort hinzugefügt. In dieser Version habe ich die in der Swift 2-Version gezeigte Beispiel-Co-Animation entfernt, da sie viele Leute verwirrt zu haben scheint.
Swift 3:
Swift 2:
quelle
nil
wenn Sie als Animationsblock übergeben werden.nil
ist auch eine absolut gültige Sache.transitionCoordinator
Null ist?transitionCoordinator
rufen Sie diese Funktion wahrscheinlich zu früh im Lebenszyklus des Navigationscontrollers auf. Warten Sie mindestens, bis derviewWillAppear()
Aufruf erfolgt, bevor Sie versuchen, einen Ansichts-Controller mit Animation zu verschieben.Basierend auf der Antwort von par (die die einzige war, die mit iOS9 funktionierte), aber einfacher und mit einem fehlenden anderen (was dazu führen könnte, dass die Fertigstellung nie aufgerufen wurde):
quelle
Derzeit unterstützt das
UINavigationController
das nicht. Aber es gibt dasUINavigationControllerDelegate
, was Sie verwenden können.Eine einfache Möglichkeit, dies zu erreichen, besteht darin
UINavigationController
, eine Abschlussblock-Eigenschaft zu unterordnen und hinzuzufügen:Bevor Sie den neuen Ansichts-Controller drücken, müssen Sie den Abschlussblock festlegen:
Diese neue Unterklasse kann entweder im Interface Builder zugewiesen oder programmgesteuert wie folgt verwendet werden:
quelle
pushViewController:animated:completion:
würde dies zu einer eleganten Lösung machen.Hier ist die Swift 4 Version mit dem Pop.
Nur für den Fall, dass jemand anderes dies braucht.
quelle
Um die Antwort von @Klaas (und als Ergebnis dieser Frage) zu erweitern, habe ich der Push-Methode Vervollständigungsblöcke direkt hinzugefügt:
Wie folgt zu verwenden:
quelle
if... (self.pushedVC == viewController) {
ist falsch. Sie müssen Test Gleichheit unter den Objekten durch die VerwendungisEqual:
, das heißt[self.pushedVC isEqual:viewController]
isEqual
wäre wahrscheinlich technisch korrekter, falls sie es jemals getan hätten.Seit iOS 7.0 können Sie
UIViewControllerTransitionCoordinator
einen Push-Abschlussblock hinzufügen:quelle
Swift 2.0
quelle
Das Hinzufügen dieses Verhaltens und das Beibehalten eines externen Delegaten erfordert etwas mehr Arbeit.
Hier ist eine dokumentierte Implementierung, die die Delegatenfunktionalität beibehält:
LBXCompletingNavigationController
quelle