2016-04-25 10 views
1

Ich habe eine ContainerVC, die eine Variable controllerToLoad enthält. Standardmäßig ist es "MainVC", aber wenn ich auf einen Menüpunkt klicke, möchte ich die ContainerVC präsentieren, aber anstatt MainVC zu laden, möchte ich SecondVC laden. lade ich die MainVC in der ViewDidLoad Methode meiner ContainerVC durch die folgenden Schritte ausführen:viewDidLoad() Aufruf vor prepareForSegue() Ausführungen: Swift

if let controller = self.storyboard?.instantiateViewControllerWithIdentifier(controllerToLoad) { 
    self.mainViewController = controller 
} 

Ich dachte, den besten Weg, dies von Segue ist zu tun, so nenne ich die folgenden Codezeilen:

self.performSegueWithIdentifier("MenuSegue", sender: self) 

Da ist in meinem prepareForSegue ich folgendes tun:

if (segue.identifier == "MenuSegue"){ 
    let secondViewController = segue.destinationViewController as! ContainerViewController 
    secondViewController.controllerToLoad = "SecondVC" 
} 

Aus irgendeinem Grund, wenn performSegueWithIdentifier nannte es lädt automatisch die ContainerVC und beginnt mit dem Setzen von self.mainViewController auf "MainVC", anstatt darauf zu warten, dass prepareForSegue ausgeführt wird. Ich weiß nicht, warum es nicht darauf wartet, prepareForSegue zu beenden.

Ich habe das getestet, indem ich eine Reihe von Druckanweisungen hinzugefügt habe. direkt vor self.performSegueWithIdentifier und vor secondViewController.controllerToLoad = "SecondVC" und in ViewDidLoad von meinem ContainerVC. die Druckanweisungen Nach der Zugabe wurde mir klar, dass, sobald performSegueWithIdentifier in der Tat genannt wird, direkt nachdem es ViewDidLoad von ContainerVC ruft dann

let secondViewController = segue.destinationViewController as! ContainerViewController secondViewController.controllerToLoad = "SecondVC"

Antwort

1

Dies ist das korrekte und zu erwartende Verhalten. In prepareForSegue können Sie auf die destinationViewController und ihre Eigenschaften, einschließlich UIView-Elemente zugreifen, so logisch muss die Ansicht bereits geladen worden sein. Daher wird viewDidLoad aufgerufen haben.

Sie könnten eine andere Methode verwenden, z. B. viewWillAppear, die nach prepareForSegue ausgeführt wird, aber es scheint, dass ein anderer Ansatz besser wäre. Vielleicht eine Methode auf Ihrem Container-View-Controller, die es aufgefordert wurde, eine neue VC zu laden und zu präsentieren.

+0

Ja, Sie hatten Recht. Ich habe meinen ContainerVC-Code genommen und ihn in eine Methode eingefügt, die den self.mainViewController auf eine Variable setzt, die ich überlasse. Toller Hinweis! –

0

denken I durchgeführt, müssen Sie diese Dinge nicht beide tun. Sie instanziieren mainController, aber wenn Sie MainSegue ausführen, wird eine zweite Instanz von mainController erstellt, und Sie haben eine falsche Reihenfolge der Aufrufzyklen für Ereignisse. Sie müssen entweder mainController durch pushViewController drücken: animiert oder erstellen Sie es überhaupt nicht.

Verwandte Themen