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.
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
Verfasst von

Lammert Westerhoff
Contact



