Multiple UIPickerView in the same UIView

后端 未结 5 1528
暖寄归人
暖寄归人 2021-02-01 20:24

I\'m a complete beginner on iOS dev and I want to create a little iOS application. On this application, 3 UIPickerViews are supposed to display different data.

相关标签:
5条回答
  • 2021-02-01 20:47

    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)
        }
    }
    
    }
    
    0 讨论(0)
  • 2021-02-01 20:48

    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
    
    0 讨论(0)
  • 2021-02-01 20:49

    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 ""
    }
    
    0 讨论(0)
  • 2021-02-01 20:58

    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
            }
    
        }
    
    0 讨论(0)
  • 2021-02-01 21:00

    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()
    
        }
    }
    
    0 讨论(0)
提交回复
热议问题