2017-12-29 12 views
0

Ich habe einen View-Controller A, der auf dem Navigations-Stack ist. A modal präsentiert einen anderen Controller B, die wiederum modal einen anderen Controller C präsentiertWie zwei Modal View-Controller auf einmal zu entlassen?

Wenn der Benutzer eine Schaltfläche in CI trifft wollen beide C und B entlassen A. zurückzukehren Wie kann ich beide B und C entlassen auf einmal?

Der folgende Code funktioniert, aber ist es sicher, dies zu tun?

let p = self.presentingViewController 
    self.dismiss(animated: true) { 
     p?.dismiss(animated: true, completion: nil) 
    } 
+0

Wenn Sie ein Storyboard verwenden, können Sie "Abwicklungssegment" verwenden. Schauen Sie sich hier zum Beispiel https://cocoacasts.com/how-do-unwind-segues-work/ an. – kiwisip

+0

@kiwisip Guter Vorschlag, aber tut mir leid, ich habe nicht erwähnt, dass B und C auch von einigen anderen Controllern abgesehen von A dargestellt werden können, also würde ich mehrere Abwicklungswege benötigen und C müsste wissen, woher B ursprünglich präsentiert wurde das könnte ein bisschen unordentlich werden. Ich suche also nach etwas, das C allein tun kann (oder C und B, wenn B auch an der Entlassung beteiligt sein muss). – Gruntcakes

+1

Sie können den presentingViewController direkt ablehnen, es sollte alle vorgestellten ViewControllers –

Antwort

0

Machen Sie den obersten View-Controller zu einer Eigenschaft. Stellen Sie sicher, dass B den obersten Ansicht-Controller für C setzt.

class C: UIViewController { 

    var topmostViewController: UIViewController? 

    @IBAction func dismiss(_ sender: Any) { 
     // If topmostViewController was not set, then assume 
     // the presenting view controller is to be dismissed. 
     (topmostViewController ?? presentingViewController)?.dismiss(animated: true) 
    } 

} 

Dies gibt Ihnen ein gutes Maß an Flexibilität, welche Ansicht Controller die Kündigung durchführt.

Verwandte Themen