Search code examples
swiftxcodeuipickerview

Xcode - My two picker views are connected together how to I make them separate picker views?


I have two picker views on one view controller (currently, there will be more) and when I select one thing on one picker view the other picker view automatically changes to the value I selected on the OTHER picker view....How do I make them two different picker views? I tried just making new methods for the new picker view but that didn't seem to work. I would really appreciate any help! Thanks in advance.

Here is my swift code :

import UIKit

class AddRatioViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {

    @IBAction func BackToHome(_ sender: Any) {
        self.performSegue(withIdentifier: "BackToHome", sender: self)
    }
    @IBOutlet weak var ChooseDrivingGear: UIPickerView!
    @IBOutlet weak var ChooseDrivingGear2: UIPickerView!

    @IBOutlet weak var chooseBox1: UIButton!
    @IBOutlet weak var chooseBox2: UIButton!


    let drivingGear = ["1", "12", "36", "60", "84"]

    override var shouldAutorotate: Bool {
        return true
    }

    override func viewDidLoad() {
        ChooseDrivingGear.isHidden = true
        ChooseDrivingGear.delegate = self
        ChooseDrivingGear.dataSource = self

        ChooseDrivingGear2.isHidden = true
        ChooseDrivingGear2.delegate = self
        ChooseDrivingGear2.dataSource = self

        super.viewDidLoad()
    }

    @IBAction func chooseBox1Pressed(_ sender: UIButton) {
        sender.isHidden = true                                  //added (to prevent overlap)
        if ChooseDrivingGear.isHidden {
           ChooseDrivingGear.isHidden = false
        }
    }

    @IBAction func chooseBox2Pressed(_ sender: UIButton) {
        sender.isHidden = true                                  //added (to prevent overlap)
        if ChooseDrivingGear2.isHidden {
           ChooseDrivingGear2.isHidden = false
        }
    }
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return drivingGear[row]
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return drivingGear.count
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        chooseBox1.setTitle(drivingGear[row], for: .normal)
        chooseBox2.setTitle(drivingGear[row], for: .normal)
        ChooseDrivingGear.isHidden = true
        chooseBox1.isHidden = false                         //added (to prevent overlap)
        ChooseDrivingGear2.isHidden = true
        chooseBox2.isHidden = false                         //added (to prevent overlap)

    }

    func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
        ChooseDrivingGear.isHidden = false
        ChooseDrivingGear2.isHidden = false
        return false
    }

    //second pickerView

}

Solution

  • The reason why his happens is that you don't check what picker view is now changed in your picker view delegate methods

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if pickerView == ChooseDrivingGear {
           //do staf for first picker 
        } else {
           //do staf for second one
        }    
    }
    

    Or it is better to use tags

        override func viewDidLoad() {
        ChooseDrivingGear.isHidden = true
        ChooseDrivingGear.delegate = self
        ChooseDrivingGear.dataSource = self
        ChooseDrivingGear.tag = 0
    
        ChooseDrivingGear2.isHidden = true
        ChooseDrivingGear2.delegate = self
        ChooseDrivingGear2.dataSource = self
        ChooseDrivingGear2.tag = 1
    
        super.viewDidLoad()
    }
    
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if pickerView.tag == 0 {
           //do staf for first picker 
        } else {
           //do staf for second one
        }    
    }
    

    p.s Also in Swift methods and variables should start with lowercase.