Trenton Tyler Trenton Tyler - 6 months ago 42
iOS Question

Prepare for Segue in Swift with Sender

I am trying to pass a color to another view controller via a "show" segue so that the color of the background can match that of the color button that was selected. I have this bit of code that prints the buttons sender tag but it is not performing that segue. What am I doing wrong? I have never worked with sender tags before so it could be something silly but I am not sure.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

if segue.identifier == "toQuiz" {
if sender?.tag == 1 {

let viewController:ViewController = segue.destinationViewController as! ViewController
let color = UIColor.blueColor()
viewController.passedColor = color

} else if sender!.tag == 2 {

let viewController:ViewController = segue.destinationViewController as! ViewController
let color = UIColor.greenColor()
viewController.passedColor = color

} else if sender!.tag == 3 {

let viewController:ViewController = segue.destinationViewController as! ViewController
let color = UIColor.yellowColor()
viewController.passedColor = color

}
}
}

@IBAction func athButtonTapped(sender: AnyObject) {

let athleteQuiz = sender as! UIButton
print("Button \(athleteQuiz.tag) was pressed!")
}

@IBAction func actorButtonTapped(sender: AnyObject) {

let actorQuiz = sender as! UIButton
print("Button \(actorQuiz.tag) was pressed!")
}

@IBAction func musicButtonTapped(sender: AnyObject) {

let musicQuiz = sender as! UIButton
print("Button \(musicQuiz.tag) was pressed!")
}


This is the storyboard layout - they are all connected properly and the identifier for the segue matches that in the storyboard.

enter image description here

enter image description here

Answer

Some things to check:

  • Does the left view controller have your class assigned to it in IB?
  • Is anything actually triggering the segue? Neither of your button actions contain a call to performSegueWithIdentifier(_:sender:)

Also, this is a very dangerous block of code; you should not be force-unwrapping sender like that. Instead, consider doing something like this:

guard let id = segue.identifier else { return } // Bail if there isn't a segue ID.
if id == "toQuiz" {
    guard let tag = (sender as? UIView)?.tag else { return } // Bail if we can't get a tag.

    // Continue examining the tag.
}
Comments