Search code examples
swiftuipickerview

Multiple Pickerviews


I want to build a viewcontroller which contains three pickerviews (which has three same options). I am having problems on how to show one specific row to the label. My code:

I changed other parts still getting errors. Edited variables' first letters to lowercase.

@IBOutlet weak var picker1: UIPickerView!

@IBOutlet weak var picker2: UIPickerView!

@IBOutlet weak var picker3: UIPickerView!

var Array  = ["Shake","Swipe Up","Swipe Right"]



@IBOutlet weak var label1: UILabel!

@IBOutlet weak var label2: UILabel!

@IBOutlet weak var label3: UILabel!

var placementAnswer = 0

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    picker1.delegate = self
    picker1.dataSource = self
    picker1.tag = 1

    picker2.delegate = self
    picker2.dataSource = self
    picker2.tag = 2

    picker3.delegate = self
    picker3.dataSource = self
    picker3.tag = 3

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.

}

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

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

    return 1
}

@IBAction func save3(_ sender: AnyObject) {
}

@IBAction func save2(_ sender: AnyObject) {
}

@IBAction func save1(_ sender: AnyObject) {


    if (placementAnswer == 0){
        label1.text = "Shake"
    }

    else if(placementAnswer == 1){
        label1.text = "Swipe Up"

    }
    else{
        label1.text = "Swipe Right"
    }


    if (placementAnswer == 0){
        label2.text = "Shake"
    }

    else if(placementAnswer == 1){
        label2.text = "Swipe Up"

    }
    else{
        label2.text = "Swipe Right"

    }
    if (placementAnswer == 0){
        label3.text = "Shake"

    }
    else if(placementAnswer == 1){
        label3.text = "Swipe Up"

    }
    else{
        label3.text = "Swipe Right"
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    picker1.delegate = self
    picker1.dataSource = self
    picker1.tag = 1

    picker2.delegate = self
    picker2.dataSource = self
    picker1.tag = 2

    picker3.delegate = self
    picker3.dataSource = self
    picker1.tag = 3

}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    if pickerView.tag == 1 {
        // do things for pickerview 1
        label1.text = row
    }
    else if pickerView.tag == 2 {
        // do things for pickerview 2
        label2.text = row
    }else {
        // do for pickerview 3
    }

    placementAnswer = row
}
}

Solution

  • Differentiate by using tag

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    
        picker1.delegate = self
        picker1.dataSource = self
        picker1.tag = 1
    
        picker2.delegate = self
        picker2.dataSource = self
        picker1.tag = 2
    
        picker3.delegate = self
        picker3.dataSource = self
        picker1.tag = 3
    }
    

    so in your delegate methods just check the tag

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return Array[row]
    
    }
    
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if pickerView.tag == 1 {
            // do things for pickerview 1
            Label1.text = Array[row]
        }
        else if pickerView.tag == 2 {
            // do things for pickerview 2
            Label2.text = Array[row]
        }else {
            // do for pickerview 3
        }
    }