wake-up-neo.com

absender prepareForSegue und PerformSegueWithIdentifier

Ich frage mich, wie die Funktionen im Titel funktionieren, und auch den Senderparameter. 

Angenommen, ein Klick auf eine Schaltfläche ruft die performSegue-Methode auf. Ruft das auch die prepareSegue-Methode auf? Wird die prepareSegue-Methode vor der performSegue-Methode aufgerufen, aber nachdem die Schaltfläche gedrückt wurde?

Ist auch der Parameter "Sender" in beiden Funktionen verknüpft? Wenn ich in der performSegue-Methode einen String als Absender übergeben, wird dies in der sendSegue-Methode auf den sender-Parameter übertragen? Wenn ich also den Senderparameter in der performSegue-Methode als "Hallo Welt" setze, ist der Senderparameter in der prepareSegue-Methode auch derselbe String? 

Vielen Dank

5
JasonP

Es gibt effektiv zwei Möglichkeiten, wie Sie ein Segment auslösen können. Die erste erfolgt über eine Aktion für ein Oberflächenelement im Interface Builder, die zweite verwendet performSegueWithIdentifier:sender: in Ihrem Code. Ich sage 'effektiv', weil unter den Deckeln, wenn die Szene aus dem Storyboard geladen wird, ein Aktionshandler konfiguriert wird, der schließlich performSegueWithIdentifier:sender: aufruft.

Wenn performSegueWithIdentifier:sender: aufgerufen wird, wird das Segue-Objekt an die prepareForSegue:sender:-Funktion Ihres View-Controllers übergeben.

In dem Fall, in dem das Segment durch eine Aktion auf ein UI-Element initiiert wurde, ist der Sender dieses UI-Element (d. H. Wenn es sich um eine Aktionsverbindung für eine UIButton handelt, ist die sender die UIButton-Instanz).

Wenn das Segment durch Ihren Code aufgerufen wird, der performSegueWithIdentifier:sender: aufruft, ist die sender das Objekt, das Sie als sender übergeben haben. Dies könnte Ihr View Controller sein, ein Button, ein Array, irgendetwas. Wenn Sie also "Hello World" als sender-Wert an performSegueWithIdentifier:sender: übergeben, wird dies sender in prepareForSegue:sender: sein.

In der Reihenfolge der Operationen:

  1. performSegueWithIdentifier:sender wird entweder durch Ihren Code oder als Ergebnis einer Aktion für ein Oberflächenelement aufgerufen
  2. Wenn Ihr View-Controller shouldPerformSegueWithIdentifier:sender: implementiert, wird diese Funktion aufgerufen. Wenn diese Funktion false zurückgibt, wird der Vorgang abgebrochen
  3. Das Segue-Objekt und das Zielansicht-Controller-Objekt werden erstellt
  4. Wenn Ihr View-Controller prepareForSegue:sender: implementiert, wird diese Funktion aufgerufen.
  5. Sobald prepareForSegue:sender: zurückkehrt, ist der Vorgang abgeschlossen.
21
Paulw11

Die Methode performSegue ruft ein Segment auf, das von einer Ansicht zur anderen ausgeführt werden soll. Bevor das Segment tatsächlich stattfindet, wird die prepareForSegue-Methode aufgerufen. Wenn Sie Daten zwischen den Ansichten übergeben möchten, müssen Sie dies dort tun. 

Die Methode performSegue nimmt nicht den Parameter an, den Sie senden möchten. Es wird nur verwendet, um das Segment an erster Stelle aufzurufen. Alle Daten, die Sie senden möchten, werden über prepareForSegue erstellt. 

Hier ist ein Beispiel. 

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    performSegueWithIdentifier("test", sender: self)
    //You can set the identifier in the storyboard, by clicking on the segue
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "test"{
        var vc = segue.destinationViewController as! RandomViewController
        vc.data = "Data you want to pass"
        //Data has to be a variable name in your RandomViewController
    }
}

Lassen Sie mich wissen, ob das hilft!

20
The_Curry_Man

The_Curry_Mans Antwort hat für mich funktioniert. Hier ist ein Update seines Codes für Swift 3.

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    performSegue(withIdentifier: "test", sender: self)
    //You can set the identifier in the storyboard, by clicking on the segue
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "test"{
        var vc = segue.destinationViewController as! RandomViewController
        vc.data = "Data you want to pass"
        //Data has to be a variable name in your RandomViewController
    }
}
5
Zion Perez

meine zwei Cent für Anfänger ... In Swift 3 heißt es:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

}

Wenn der ankommende Controller (der Klasse MyController) also eine "fillData" -Methode implementiert:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if let destController = segue.destination as MyController{

        destController.fillData(...)
    }

}
2
ingconti