ios 同一个 UIView 中的多个 UIPickerView

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/30238224/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 05:58:36  来源:igfitidea点击:

Multiple UIPickerView in the same UIView

iosswiftuipickerview

提问by fselva

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

我是 iOS 开发的完全初学者,我想创建一个小 iOS 应用程序。在这个应用程序中,3 个UIPickerViews应该显示不同的数据。

My problem is on the display. I'm used to dev on Android or Windows phone and I don't understand how to populate the UIPickerViewswith different data.

我的问题出在显示器上。我习惯于在 Android 或 Windows 手机上开发,我不明白如何UIPickerViews用不同的数据填充。

This is the code I have already written:

这是我已经写的代码:

//
//  ViewController.swift
//  iphoneVersion
//
//  Created by fselva on 13/05/2015.
//  Copyright (c) 2015 fselva. All rights reserved.
//

import UIKit



class ViewController: UIViewController, UIPickerViewDelegate{



@IBOutlet weak var pickerView1: UIPickerView!
@IBOutlet weak var pickerView2: UIPickerView!
@IBOutlet weak var pickerView3: UIPickerView!

var test = ["Todo","Waiting","Maybe","Inbox","Note"]

var test2 = ["@Office","@Computer","@Home","@Meeting", "@Read", "@Achat", "@Call"]



override func viewDidLoad() {
    super.viewDidLoad()
    pickerView1.tag = 1
    pickerView2.tag = 2
    pickerView3.tag = 3
    // Do any additional setup after loading the view, typically from a nib.
}

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

func numberOfComponentsInPickerView(pickerView : UIPickerView!) -> Int{
    return 1
}

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
    if pickerView2.tag == 2 {
        return test.count
    } else if pickerView3 == 3{
        return test2.count
    }
    return 1
}

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 ""
}


}

@IBOutlet weak var pickerView1: UIPickerView!has been automatically created by Ctrl+Click from the storyboard to the ViewController.swift.

@IBOutlet weak var pickerView1: UIPickerView!已通过 Ctrl+单击从 storyboard 自动创建到 ViewController.swift。

The first UIPickerViewis currently supposed to display nothing. The second one is supposed to display testand the third one displays test2.

第一个UIPickerView当前应该不显示任何内容。第二个应该显示test,第三个显示test2

After hours of investigation on internet, I have heard about tags to define who must display what, but it doesn't work.

经过几个小时的互联网调查,我听说过标签来定义谁必须显示什么,但它不起作用。

Am I doing something wrong, am I missing something somewhere?

我做错了什么,我是否在某处遗漏了什么?

回答by ChikabuZ

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:

也不要忘记在 IB 或代码中设置委托:

pickerView1.delegate = self

回答by Enamul Haque

Here is Full Source Multiple UIPickerView in the TextFieldin Swift 3

这是TextFieldSwift 3中的完整源多 UIPickerView

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)
    }
}

}

回答by kanobius

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 ""
}

回答by Narayan Kushwah

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
        }

    }

回答by oscar castellon

Try this:

尝试这个:

enter image description here

在此处输入图片说明

    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()

    }
}