Das Verwerfen eines ViewControllers im Stapel unten verhält sich nicht wie erwartet

8

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):

%Vor%

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:

%Vor%

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 %Vor%

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.

    
rdurand 24.09.2014, 13:00
quelle

2 Antworten

2

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:

%Vor%

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:

%Vor%     
rhelba 10.11.2014, 23:16
quelle
1

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%     
Razvan 24.09.2014 13:40
quelle