1

Is it possible to have a single pickerView in swift which changes its value based on the button pressed. I could not figure out a way to implement more than one parameter through pickerView in a single ViewController. An alternative solution like a dropdown menu is fine too. Example/functional code would be great if provided. This is for a quiz app which would take multiple parameters.

enter image description here

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {

@IBOutlet weak var pickerView: UIPickerView!
@IBOutlet weak var selectionBtn: UIButton!

let animals = ["Lion", "Dog", "Monkey", "Cat", "Bat"]

override func viewDidLoad() {

    pickerView.isHidden = true

    pickerView.delegate = self
    pickerView.dataSource = self

    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

@IBAction func selectPressed(_ sender: UIButton) {

    if pickerView.isHidden {
        pickerView.isHidden = false
    }
}

public func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}

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

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

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    selectionBtn.setTitle(animals[row], for: .normal)
    pickerView.isHidden = true


}

}
TheTiger
  • 13,264
  • 3
  • 57
  • 82
  • 1
    use different arrays than `animals` when you click button use different set of thata and reload picker, that will work – Lu_ Apr 19 '18 at 11:35
  • Possible duplicate of [How to use 2 UIPickerView's in one View Controller?](https://stackoverflow.com/questions/27642164/how-to-use-2-uipickerviews-in-one-view-controller) – TheTiger Apr 19 '18 at 12:42

6 Answers6

0

let say you added 2 PickerView to your View - set the 1st picker´s tag as 1 & 2 for the 2nd picker under the Attributes Inspector - CTRL + drag from each picker to the top yellow View Controller icon and choose dataSource.Repeate the same choosing delegate - repeate the above for the other picker too - add pickerview & pickerviewdelegation to your ViewController class:

class ViewController: UIViewController,UIPickerViewDataSource,UIPickerViewDelegate {
  • in your ViewController class, create empty arrays for the pickers:

    var picker1Options = []
    var picker2Options = []
    
  • on viewDidLoad() method, populate the arrays with your content:

    picker1Options = ["p1 1","p1 2","p1 3","p1 4","p1 5"]
    picker2Options = ["p2 1","p2 2","p2 3","p2 4","p2 5"]
    
  • implement the delegate & pickerview methods:

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }
    
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if (pickerView.tag == 1){
            return picker1Options.count
        }else{
            return picker2Options.count
        }
    }
    
    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
        if (pickerView.tag == 1){
            return "\(picker1Options[row])"
        }else{
            return "\(picker2Options[row])"
        }
    }
    

Hope this will help.

Developer Guy
  • 2,318
  • 6
  • 19
  • 37
Aleem
  • 3,173
  • 5
  • 33
  • 71
0

Yes by having more than 1 data source

let animals1 = ["Lion", "Dog", "Monkey", "Cat", "Bat"]

let animals2 = ["Lion", "Dog", "Monkey", "Cat", "Bat"]

var mainData = [String]()

 public func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
 }

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

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

 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

   selectionBtn.setTitle(mainData[row], for: .normal)
   pickerView.isHidden = true

 }

assign mainData to say animal1

and reload

pickerView.reloadAllComponents()
Shehata Gamal
  • 98,760
  • 8
  • 65
  • 87
0

Keep a separate array and put your array into it according to your logic. Use that array in pickerview. Try This:

let animals = ["Lion", "Dog", "Monkey", "Cat", "Bat"]
let secondAnimals = ["Lion1", "Dog1", "Monkey1", "Cat1", "Bat1"]
let pickerArray = [String]()

@IBAction func selectPressed(_ sender: UIButton) {
    pickerArray = animals  //change it according to your logic
    pickerView.reloadAllComponents()
    pickerView.isHidden = !pickerView.isHidden
}

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

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

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    selectionBtn.setTitle(pickerArray[row], for: .normal)
    pickerView.isHidden = true


}
Arnab
  • 4,216
  • 2
  • 28
  • 50
0

You can have two arrays to populate the picker like this

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{

        if numb == 1
        {
          return firstArray.count
        }
        else

           return secondArray.count
        }
    }

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


        if numb == 1
        {
           return firstArr[row]
        }
        else
        {
           return secondArr[row]
        }
    }
Catherine
  • 654
  • 5
  • 15
0

Whenever you have to change the data source for datepicker, make sure after that you are calling method

picker.reloadAllComponents()

Take flag and use appropriate data source.

Manish Mahajan
  • 2,062
  • 1
  • 13
  • 19
0
let arrAny : [String] = [String]()

button action:

@IBAction func btn2Pressed(_ sender: UIButton) {
    arrAny = ["Lion1", "Dog1", "Monkey1", "Cat1", "Bat1"]
    if pickerView.isHidden {
         pickerView.isHidden = false
    }
}

@IBAction func btn1Pressed(_ sender: UIButton) {
     arrAny = ["Lion", "Dog", "Monkey", "Cat", "Bat"]
     if pickerView.isHidden {
          pickerView.isHidden = false
     }
}

pickerView delegate:

public func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}

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

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return arrAny[row]
}
TheTiger
  • 13,264
  • 3
  • 57
  • 82
Divya Thakkar
  • 212
  • 3
  • 13