Blog

Den 'Absender' in Segues verstehen und zur Weitergabe von Daten an einen anderen View Controller verwenden

Lammert Westerhoff

Aktualisiert Oktober 22, 2025
5 Minuten

Einer der Nachteile der Verwendung von Segues in Storyboards ist, dass Sie oft noch Code schreiben müssen, um Daten vom Quell-Viewcontroller an den Ziel-Viewcontroller weiterzugeben. Die Die Methode prepareForSegue(:sender:) ist der richtige Ort dafür. Manchmal müssen Sie eine Segue manuell auslösen, indem Sie performSegueWithIdentifier(:sender:) aufrufen. und dort wissen Sie normalerweise, welche Daten Sie weitergeben müssen. Wie können wir vermeiden, dass wir zusätzliche Zustandsvariablen in unserem Source-View-Controller hinzufügen, nur um Daten weiterzugeben? Ein einfacher Trick besteht darin, den Absenderparameter zu verwenden, den beide Methoden haben.

Update: Bitte beachten Sie, dass dies als Anti-Pattern gilt, wie einige Leser weiter unten kommentiert haben. Dieser Beitrag soll die Möglichkeiten von Segues erkunden, was nicht bedeutet, dass Sie sie immer verwenden sollten. Verwenden Sie sie nur, wenn es angebracht ist oder wenn keine andere Option zur Verfügung steht.Der Parameter sender wird normalerweise von Storyboards verwendet, um das UI-Element anzugeben, das den Segue ausgelöst hat, z.B. eine UIButton, wenn sie gedrückt wird, oder eine UITableViewCell, die den Segue durch Auswahl auslöst. Auf diese Weise können Sie in prepareForSegue:sender: feststellen, was den Segue ausgelöst hat, und auf dieser Grundlage (und natürlich dem Segue-Identifikator) einige Aktionen durchführen und den Ziel-View-Controller konfigurieren oder sogar festlegen, dass der Segue überhaupt nicht ausgeführt werden soll, indem Sie in shouldPerformSegueWithIdentifier(:sender:) false zurückgeben .Wenn es nicht möglich ist, den Segue über ein UI-Element im Storyboard auszulösen, müssen Sie stattdessen performSegueWithIdentifier(:sender:) verwenden, um ihn manuell auszulösen. Dies kann der Fall sein, wenn keine direkte Benutzerinteraktion die Aktion eines Steuerelements auslösen soll, das im Code erstellt wurde. Vielleicht möchten Sie beim Drücken einer Taste eine zusätzliche Logik ausführen und danach den Segue ausführen. Wie auch immer die Situation aussieht, Sie können das Argument Absender zu Ihrem Vorteil nutzen. Sie können in prepareForSegue(:sender:) oder shouldPerformSegueWithIdentifier(:sender:) alles übergeben, was Sie benötigen. Sehen wir uns einige Beispiele an.

Bildschirmfoto 2015-05-08 um 23.25.37

Hier haben wir zwei sehr einfache View-Controller. Der erste hat drei Schaltflächen für verschiedene Farben. Wenn Sie auf eine der Schaltflächen tippen, wird der Name der ausgewählten Farbe auf ein Etikett geschrieben und der zweite View Controller wird aktiviert. Der gedrückte View-Controller setzt seine Hintergrundfarbe auf die Farbe, die durch die angetippte Schaltfläche dargestellt wird. Dazu müssen wir ein UIColor-Objekt an den Ziel-Viewcontroller weitergeben. Obwohl dies durch die Erstellung von 3 verschiedenen Segues von den Schaltflächen direkt zum Ziel-Viewcontroller erfolgen könnte, haben wir uns dafür entschieden, das Antippen der Schaltfläche selbst zu verarbeiten und die Segue manuell auszulösen. Sie könnten etwa folgenden Code verwenden, um dies zu erreichen: [objc] class ViewController: UIViewController { @IBOutlet weak var label: UILabel! var tappedColor: UIColor? @IBAction func tappedRed(sender: AnyObject) { label.text = "Rot angezapft" tappedColor = UIColor.redColor() performSegueWithIdentifier("ShowColor", sender: sender) } @IBAction func tappedGreen(sender: AnyObject) { label.text = "Grün getippt" tappedColor = UIColor.greenColor() performSegueWithIdentifier("ShowColor", sender: sender) } @IBAction func tappedBlue(sender: AnyObject) { label.text = "Blau getippt" tappedColor = UIColor.blueColor() performSegueWithIdentifier("ShowColor", sender: sender) } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "ShowColor" { if let colorViewController = segue.destinationViewController as? ColorViewController { colorViewController.color = tappedColor } } } } class ColorViewController: UIViewController { var color: UIColor? override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = color } } [/objc] Wir haben eine Zustandsvariable namens tappedColor erstellt, um die Farbe zu verfolgen, die weitergegeben werden muss. Sie wird in jeder der Aktionsmethoden vor dem Aufruf von performSegueWithIdentifier("ShowColor", sender: sender) gesetzt und dann in prepareForSegue(_:sender:) wieder ausgelesen, so dass wir sie an den Ziel-Viewcontroller weitergeben können. Die Aktionsmethoden haben die getippten UIButtonsals Absenderargument gesetzt, und da dies das eigentliche Element ist, das die Aktion ausgelöst hat, ist es sinnvoll, dieses als Absender zu setzen, wenn wir den Segue ausführen. Genau das tun wir also im obigen Code. Aber da wir den Absender bei der Vorbereitung der Überblendung nicht verwenden, können wir die Farbe auch direkt weitergeben. Hier ist eine neue Version des ViewControllers, die genau das tut: [objc] class ViewController: UIViewController { @IBOutlet weak var label: UILabel! @IBAction func tappedRed(sender: AnyObject) { label.text = "Rot angezapft" performSegueWithIdentifier("ShowColor", Absender: UIColor.redColor()) } @IBAction func tappedGreen(sender: AnyObject) { label.text = "Grün getippt" performSegueWithIdentifier("ShowColor", Absender: UIColor.greenColor()) } @IBAction func tappedBlue(sender: AnyObject) { label.text = "Blau getippt" performSegueWithIdentifier("ShowColor", sender: UIColor.blueColor()) } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "ShowColor" { if let colorViewController = segue.destinationViewController as? ColorViewController {colorViewController.color = sender as? UIColor } } } } [/objc] Auf diese Weise können wir unsere zusätzliche Variable tappedColor loswerden. Es könnte den Anschein erwecken (und das tut es vielleicht auch), dass der Parameter sender missbraucht wird, also verwenden Sie ihn mit Vorsicht und nur dort, wo es angebracht ist. Seien Sie sich der Konsequenzen bewusst. Wenn ein anderer Code oder ein Element in einem Storyboard denselben Segue auslöst (d.h. mit demselben Bezeichner), dann könnte der Absender statt des erwarteten Objekts einfach ein UI-Element sein, was zu unerwarteten Ergebnissen und vielleicht sogar zu Abstürzen führt, wenn Sie den Absender auf etwas zwingen, das er nicht ist. Sie finden den Beispielcode in Form eines Xcode-Projekts auf Github SegueColorSample.

Verfasst von

Lammert Westerhoff

Contact

Let’s discuss how we can support your journey.