2016-03-24 12 views
1

Ich möchte etwas Ähnliches erstellen/bearbeiten Seite für die Kontakte App erstellen. Es scheint so zu sein, dass sich hinter einer modalen Ansicht eine Ansicht ändert, aber ich bin mir nicht sicher, wie dies zu diesem Verhalten führt.Ändern der Ansicht Controller hinter einem Modal View Controller

Hier ist, was ich bisher haben gesucht:

iOS: Switch view controller behind current modal view controller? Es scheint, wie dieser Beitrag eine richtige Antwort hat. Ich bin mir aber nicht sicher, was er mit making the root view controller a delegate of the modal view meint und was es heißt call a delegate method. Hier

ist das, was ich erreichen will:

ein VC1 Stellen Sie sich vor, die in einer Navigationssteuerung eingebettet ist. Ich tippe auf eine Taste auf VC1, was bewirkt, dass VC2 modal präsentiert wird. Wenn Sie in vc2 "done" drücken, wird die modale Ansicht vc2 und vc3 nicht mehr angezeigt. Wenn Sie in vc3 auf eine Zurück-Schaltfläche tippen, geht es zurück zu vc1.

Hier ist das aktuelle Verhalten:

I vc2 zeigt oben auf VC1 modal machen. Aber wenn der "Fertig" -Knopf auf vc2 gedrückt wird, geht es einfach zurück zu vc1 anstatt zu vc3 zu gehen, dann, wenn auf "zurück" getippt wird, geht es zu vc1.

Hier ist, was ich bereits versucht habe:

Ich versuche segue von VC1 bis VC3 ohne Animation und modal segue dann v2. Diese Art von Arbeiten mit extrem hässlich Übergang und es verursacht Presenting view controllers on detached view controllers is discouraged Fehler zu zeigen. Ich habe auch verschiedene Kombinationen von unwindToSegue Methoden ausprobiert, aber ich konnte das auch nicht herausfinden.

Jede Hilfe wäre sehr willkommen! Vielen Dank für Ihre Zeit :)

Antwort

1

Sie machen den root-View-Controller (vc1) zu einem Stellvertreter Ihres modal view-Controllers, indem Sie ein Protokoll in vc1 erstellen und als Eigenschaft Ihres Modal-View-Controllers haben. Wenn Sie den modalen Ansichtscontroller beenden, rufen Sie eine der Delegate-Methoden auf. So etwas wie dies könnte für Sie arbeiten:

VC1:

protocol Vc1Delegate: class { 
    func pushToVc3() 
} 

class Vc1: UIViewController, Vc1Delegate 
{ 
    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "Vc2Modal" { 
      if let _vc2 = segue.destinationViewController as? Vc2 { 
       _vc2.delegate = self 
      } 
     } 
    } 

    @IBAction func showVc2Modal() { 
     performSegueWithIdentifier("Vc2Modal", sender: nil) 
    } 

    // MARK: Vc1Delegate 

    func pushToVc3() { 
     performSegueWithIdentifier("Vc3PushWithoutAnimation", sender: nil) 
    } 
} 

Vc2:

class Vc2: UIViewController 
{ 
    weak var delegate: Vc1Delegate? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    @IBAction func dismiss() { 
     delegate?.pushToVc3() 
     dismissViewControllerAnimated(true, completion: nil) 
    } 
} 
+0

ich für die Super späte Antwort entschuldigen. Aber vielen Dank, dass Sie sich die Zeit genommen haben, meine Frage zu beantworten. Was ist die Bedeutung hinter dieser Codezeile '_vc2.delegate = self'? – aejhyun

+0

Ich verstehe die Bedeutung dieses Codes. Vielen Dank, dass du dir die Zeit genommen hast, meine Frage zu beantworten. Es löste mein Problem :) – aejhyun

+0

Ihre Lösung funktioniert nicht. Controller hinter Modal nicht vertauscht – Codenator81