Ich baue eine komplexe App, die eine Art Zweig in der Mitte hat.
Irgendwann in der App wird ein bestimmter UIViewController angezeigt, wir nennen ihn mainViewController
(abgekürzt mainVC
).
Das mainVC
stellt einen anderen View-Controller nach Code unter Verwendung des folgenden Codes dar (ich entferne Teile davon aus Datenschutzgründen):
Der secondVC
wird später einen anderen View-Controller namens thirdVC
darstellen. Dies geschieht mithilfe eines benutzerdefinierten Abschnitts, der im Storyboard des obigen Codes festgelegt ist. Der Code sieht folgendermaßen aus:
Wie Sie sehen können, präsentiert dieser Abschnitt den Zielansicht-Controller modal (mit Hilfe von presentViewController:
) mit einer benutzerdefinierten Animation (eine Folie von rechts nach links).
Also im Grunde ist hier alles in Ordnung. Ich präsentiere das secondVC
mit einer klassischen modalen Animation (schiebe von unten nach oben) und präsentiere das thirdVC
mit meinem benutzerdefinierten Übergang.
Aber wenn ich thirdVC
ablehnen möchte, möchte ich direkt zu mainVC
zurückkehren. Also rufe ich folgendes aus dem thirdVC
:
Auf diese Weise rufe ich dismissViewControllerAnimated:
direkt auf mainVC
(referenziert von self.presentingViewController.presentingViewController
) an, und ich erwarte, dass thirdVC
mit einer Animation verworfen wird und die secondVC
einfach verschwindet ohne Animation.
Wie Apple in der Dokumentation zur UIViewController-Klasse sagt:
Der präsentierende View-Controller ist dafür zuständig, die Ansicht zu verwerfen Controller präsentierte es . Wenn Sie diese Methode in der dargestellten Ansicht aufrufen Controller selbst, leitet er die Nachricht automatisch an die Darstellungsansicht Controller.
Wenn Sie mehrere View-Controller nacheinander präsentieren , erstellen Sie damit ein Stapel von präsentierten View-Controllern, Aufruf dieser Methode in einer Ansicht Controller im unteren Stapel gibt die direkte untergeordnete Ansicht aus Controller und alle View-Controller über diesem Kind auf dem Stapel . Wenn dies geschieht, wird nur die oberste Ansicht in einem animierten Fenster ausgeblendet Mode ; alle Zwischenansicht-Controller werden einfach aus dem entfernt Stapel. Die oberste Ansicht wird über ihren modalen Übergang geschlossen Stil, der sich von den Stilen anderer View-Controller unterscheiden kann tiefer im Stapel.
Das Problem ist, dass es nicht passiert. In meinem Szenario verschwindet die thirdVC
und zeigt an, dass secondVC
mit der klassischen modalen Slide-to-Bottom-Animation verworfen wird.
Was mache ich falsch?
Bearbeiten:
So @ codeFi's Antwort funktioniert wahrscheinlich in einem klassischen Projekt, aber das Problem hier ist, dass ich an einem Framework arbeite. Also wäre mainVC
in einer Client-App und die secondVC
und thirdVC
sind in meinem Framework, in einem separaten Storyboard. Ich habe keinen Zugriff auf mainVC
auf andere Weise als einen Verweis darauf in meinem Code, so dass Abwicklungssegmente hier leider keine Option sind.
Ich habe genau das gleiche Problem und es ist mir gelungen, es visuell zu bearbeiten, indem ich einen Schnappschuss des Bildschirms als Unteransicht von secondVC.view
anfüge, etwa so:
Nicht schön, aber es scheint zu funktionieren.
HINWEIS: Wenn Ihr secondVC
über eine Navigationsleiste verfügt, müssen Sie die Navigationsleiste zwischen dem Schnappschuss des Bildschirms und dem Hinzufügen des Schnappschusses als Unteransicht zu secondVC
ausblenden, da sonst der Der Schnappschuss erscheint unter der Navigationsleiste und zeigt während der Kündigungs-Animation scheinbar eine doppelte Navigationsleiste an. Code:
Ich hatte das gleiche Problem und habe es mit UnwindSegues behoben.
Sie müssen lediglich eine IBAction Unwind Segue-Methode im ViewController hinzufügen, zu der Sie wechseln möchten, und dann in IB die Exit-Aktion mit der Unwind-Methode verbinden.
Beispiel:
Nehmen wir an, Sie haben drei ViewControllers (VC1, VC2, VC3) und möchten von VC3 zu VC1 wechseln.
Schritt 1 Fügen Sie VC1 eine Methode wie folgt hinzu:
%Vor%Schritt 2 Gehen Sie im Interface Builder zu VC3 und wählen Sie es aus. Ziehen Sie dann mit gedrückter STRG-Taste von Ihrem VC-Symbol zum Beenden-Symbol und wählen Sie die Methode aus, die Sie gerade in VC1 hinzugefügt haben.
Schritt 3 Wählen Sie in IB und mit VC3 ausgewählt Ihre Abwicklungssequenz aus, und fügen Sie im Attribute Inspector eine Segue-Kennung hinzu.
Schritt 4 Gehen Sie zu VC3, wo Sie Ihren Abschnitt ausführen müssen (oder den VC schließen), und fügen Sie Folgendes hinzu:
%Vor%Tags und Links objective-c ios uiviewcontroller presentviewcontroller