Search code examples
iostagsswift4prepared-statementsegue

.tag is not working when trying to segue 3 possible values in Swift 4


I need to segue 3 possible values between the view controllers depending on whatever FIRE BUTTON the user selects. I can transfer one value but I can only transfer one value. I tried to use .tag to get the correct value transferred but it is not working. I think it is clear what I am trying to do. I can not transfer 3 possible values right now.

let FIRE = UIButton()
let FIRE2 = UIButton()
let FIRE3 = UIButton()

override func viewDidLoad() {
    super.viewDidLoad()



    view.addSubview(FIRE)

    let image = UIImage(named: "a.png") as UIImage?
    FIRE.setImage(image, for: .normal)
    FIRE.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0).isActive = true
    FIRE.topAnchor.constraint(equalTo: view.topAnchor, constant: 200).isActive = true
    FIRE.widthAnchor.constraint(equalToConstant: 250).isActive = true
    FIRE.heightAnchor.constraint(equalToConstant: 100).isActive = true
    FIRE.translatesAutoresizingMaskIntoConstraints = false

      FIRE.addTarget(self, action:#selector(handleRegisterb), for: .allTouchEvents)



    view.addSubview(FIRE2)

    let image2 = UIImage(named: "b.png") as UIImage?
    FIRE2.setImage(image2, for: .normal)
    FIRE2.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0).isActive = true
    FIRE2.topAnchor.constraint(equalTo: view.topAnchor, constant: 400).isActive = true
    FIRE2.widthAnchor.constraint(equalToConstant: 250).isActive = true
    FIRE2.heightAnchor.constraint(equalToConstant: 100).isActive = true
    FIRE2.translatesAutoresizingMaskIntoConstraints = false

    FIRE2.addTarget(self, action:#selector(handleRegisterb), for: .allTouchEvents)

    view.addSubview(FIRE3)

    let image3 = UIImage(named: "c.png") as UIImage?
    FIRE3.setImage(image3, for: .normal)
    FIRE3.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0).isActive = true
    FIRE3.topAnchor.constraint(equalTo: view.topAnchor, constant: 600).isActive = true
    FIRE3.widthAnchor.constraint(equalToConstant: 250).isActive = true
    FIRE3.heightAnchor.constraint(equalToConstant: 100).isActive = true
    FIRE3.translatesAutoresizingMaskIntoConstraints = false

    FIRE3.addTarget(self, action:#selector(handleRegisterb), for: .allTouchEvents)

}

@objc func handleRegisterb(sender: UIButton){
    performSegue(withIdentifier: "beg", sender: self)
   FIRE.tag = 1
}

@objc func handleRegisterb2(sender: UIButton){
    performSegue(withIdentifier: "beg", sender: self)
    FIRE.tag = 2
}

@objc func handleRegisterb3(sender: UIButton){
    performSegue(withIdentifier: "beg", sender: self)
    FIRE.tag = 3
}


override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "beg") {


        if FIRE.tag == 1 {
            let vc = segue.destination as! ViewController
            vc.score = "a"

        }


        if FIRE.tag == 2 {
            let vc = segue.destination as! ViewController
            vc.score = "b"

        }
        if FIRE.tag == 3 {
            let vc = segue.destination as! ViewController
            vc.score = "c"

       }
    }
}

Solution

  • You can send the selected tag in performSegue method as part of sender,

    @objc func handleRegisterb(sender: UIButton){
        performSegue(withIdentifier: "beg", sender: 1)
    }
    
    @objc func handleRegisterb2(sender: UIButton){
        performSegue(withIdentifier: "beg", sender: 2)
    }
    
    @objc func handleRegisterb3(sender: UIButton){
        performSegue(withIdentifier: "beg", sender: 3)
    }
    

    Then in prepare method based on the tag value assign the score,

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if (segue.identifier == "beg") {
            let tag = sender as! Int
            let vc = segue.destination as! ViewController
    
            if tag == 1 {
                vc.score = "a"
            } else if tag == 2 {
                 vc.score = "b"
            } else if tag == 3 {
                 vc.score = "c"
            }
        }
    }