Multiple UIPickerView in the same UIView

余生长醉 提交于 2019-12-02 18:22:06

You don't need tags, just use:

 func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
        if pickerView == pickerView1 {
            //pickerView1
        } else if pickerView == pickerView2{
           //pickerView2
        }

also don't forget to set delegate in IB or in code:

pickerView1.delegate = self

You're comparing instances with tags.

Replace:

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
    if pickerView2 == 2 {
        return test[row]
    } else if pickerView3 == 3{
        return test2[row]
    }
        return ""
}

with:

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
    if pickerView2.tag == 2 {
        return test[row]
    } else if pickerView3.tag == 3 {
        return test2[row]
    }
        return ""
}

Anyway, you don't need to tag your pickers. The pickers come in the datasource and delegate methods. You can compare instances. Something like this:

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
    if pickerView2 == pickerView {
        return test[row]
    }
    if pickerView3 == pickerView {
        return test2[row]
    }
    return ""
}

Here is Full Source Multiple UIPickerView in the TextField in Swift 3

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {

@IBOutlet weak var textFiel1: UITextField!

@IBOutlet weak var textFiel_2: UITextField!   


 let piker1 = UIPickerView()
 let piker2 = UIPickerView()

let country = ["Ban","Ind","PK"]
let number = ["1","2","3"]


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

    piker1.dataSource = self
    piker1.delegate = self

    piker2.dataSource = self
    piker2.delegate = self


    piker1.tag = 1
    piker2.tag = 2;



     textFiel1.inputView = piker1
      textFiel_2.inputView = piker2


}

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

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



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



    if pickerView == piker1 {
        return country.count

    } else if pickerView == piker2{
         return number.count
    }

    return 1
}

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


    if pickerView == piker1 {
        return country[row]

    } else if pickerView == piker2{
         return number[row]
    }
    return ""
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    if pickerView == piker1 {
        textFiel1.text = country[row]
          self.view.endEditing(false)
    } else if pickerView == piker2{
        textFiel_2.text = number[row]
          self.view.endEditing(false)
    }
}

}

I would suggest to define a variable in controller then decide the value based on field selection

func textFieldDidBeginEditing(_ textField: UITextField) {
        if(textField == self.txtAge){
            **isAgeField=0**
            self.pickUp(txtAge)
        }else{
            **isAgeField=1**
            self.pickUpTimezone(timezonetxt)
        }
    }`

then you can add condition inside the picker view as below 

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
       if isAgeField == 1 {
            return timeZoneList.count
        }else {
            return arrAge.count
        }
    }
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?{
        if isAgeField == 1 {
            return timeZoneList[row]
        }else {
            return arrAge[row] as? String
        }


    }
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        **if isAgeField == 1 {**
            timeZonepickerViewIndex = row
        }else  {
            selectedIndex = row
        }

    }

Try this:

    class UserConfig: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {

    @IBOutlet weak var lblPeso: UILabel!
    @IBOutlet weak var lblAlto: UILabel!
    @IBOutlet weak var pickerView: UIPickerView!
    @IBOutlet weak var btPeso: UIButton!
    @IBOutlet weak var btAlto: UIButton!

    var pulsado = 1

    let userDefault = UserDefaults.standard
    let pesoArray = [50,51,52,53,54,55,56,57,58,59,
                     60,61,62,63,64,65,66,67,68,69,
                     70,71,72,73,74,75,76,77,78,79,
                     80,81,82,83,84,85,86,87,88,89,
                     90,91,92,93,94,95,96,97,98,99,
                     100,101,102,103,104,105,106,107,108,109,
                     110,111,112,113,114,115,116,117,118,119,
                     120,121,122,123,124,125,126,127,128,120,
                     130]
    let altoArray = [150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
                     160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
                     170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
                     180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
                     190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
                     200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
                     210, 211, 212]

    override func viewDidLoad() {
        super.viewDidLoad()

        pickerView.delegate = self
        pickerView.dataSource = self
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }
    @IBAction func volver(_ sender: Any) {

        self.dismiss(animated: true, completion: nil)
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if pulsado == 1 {
            return altoArray.count
        } else {
            return pesoArray.count
        }
    }

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

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

        if pulsado == 1{
            return String(format: "%i", altoArray[row])
        }else{
            return String(format: "%i", pesoArray[row])
        }
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if pulsado == 1 {
            lblAlto.text = String(format: "%i", altoArray[row])
        } else {
            lblPeso.text = String(format: "%i", pesoArray[row])
        }
    }
    @IBAction func altoPressed(_ sender: Any) {

        pulsado = 1
        pickerView.reloadAllComponents()

    }
    @IBAction func pesoPressed(_ sender: Any) {

        pulsado = 2
        pickerView.reloadAllComponents()

    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!