ios UIPickerview 最佳实践?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/28630253/
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 04:55:35  来源:igfitidea点击:

UIPickerview best practice?

iosswiftuipickerview

提问by user1555112

One short question: on a registration process I would like to ask the user to choose a value from a list of values.

一个简短的问题:在注册过程中,我想请用户从值列表中选择一个值。

Is it the right way to use a view Controller adding there all text fields and for the values a picker view? As the picker view needs so much space in between the text fields area I wonder what the best practice in this case would be?

使用视图控制器添加所有文本字段和选择器视图的值是否正确?由于选择器视图在文本字段区域之间需要如此多的空间,我想知道在这种情况下的最佳实践是什么?

this is my code so far:

到目前为止,这是我的代码:

class RegisterViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource{

@IBOutlet weak var gradeTextField: UITextField!
@IBOutlet weak var gradePicker: UIPickerView!

let gradePickerValues = ["5. Klasse", "6. Klasse", "7. Klasse"]

func numberOfComponentsInPickerView(pickerView: UIPickerView!) -> Int{
    return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
    return gradePickerValues.count
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
    return gradePickerValues[row]
}
func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int){
    gradeTextField.text = gradePickerValues[row]
    self.view.endEditing(true)
}

override func viewDidLoad() {
    super.viewDidLoad()

    statusMessageLabel.hidden = true

    gradePicker.dataSource = self
    gradePicker.delegate = self
    gradePicker.hidden = true

    gradeTextField.inputView = UIPickerView()
    gradeTextField.text = gradePickerValues[0]

}

The pickerview is hidden at the beginning and appears only when I select the text field, this is fine so far... But the the picker view is empty...

选择器视图一开始是隐藏的,只有当我选择文本字段时才会出现,到目前为止还好……但是选择器视图是空的……

controller view with open picker view

带有打开选择器视图的控制器视图

回答by Alexander Zimin

It depends on controller appearance. If there only one choose action per screen it will be better to put Table Viewon it and selected row will be current selection.

这取决于控制器的外观。如果每个屏幕只有一个选择操作,最好放在Table View它上面,所选行将是当前选择。

If screen has multiply fields, that user should act with, then, in my opinion, it's better to put label+ buttonabove it and when user press this buttonyou just shows Picker Viewfrom screen bottom. When user select any row in Picker Viewyou change label text, but don't hide picker itself, it should be done by pressing "Done" buttonyou place above.

如果屏幕有多个字段,那么该用户应该采取行动,那么,在我看来,最好将label+button放在它上面,当用户按下它时,button您只会Picker View从屏幕底部显示。当用户选择Picker View您更改标签文本中的任何行时,但不要隐藏选择器本身,应该通过按button您放置在上方的“完成”来完成。

Hope this helps.

希望这可以帮助。



Update:

更新

Your problem because you just forget to set dataSourceproperty of UIPickerView

你的问题,因为你只是忘记设置dataSource属性UIPickerView

Just do: gradePicker.dataSource = selfin viewDidLoad()

只做:gradePicker.dataSource = selfviewDidLoad()

And don't forget to implements protocol here: class RegisterViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource

并且不要忘记在这里实现协议: class RegisterViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource



Update 2:

更新2

Finally made it. If you add UIPickerViewin inputView of your textFiled, then It should NOT be in IB. So you could remove it from storyboard (or .xib, if you use it).

终于做到了。如果您添加UIPickerViewtextFiled 的 inputView,那么它不应该在 IB 中。所以你可以从故事板(或 .xib,如果你使用它)中删除它。

Then change code to be something like this:

然后将代码更改为如下所示:

class RegisterViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

    @IBOutlet weak var gradeTextField: UITextField!
    var gradePicker: UIPickerView!

    let gradePickerValues = ["5. Klasse", "6. Klasse", "7. Klasse"]

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

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

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

    func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int){
        gradeTextField.text = gradePickerValues[row]
        self.view.endEditing(true)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        gradePicker = UIPickerView()

        gradePicker.dataSource = self
        gradePicker.delegate = self

        gradeTextField.inputView = gradePicker
        gradeTextField.text = gradePickerValues[0]
    }
}

回答by Mr.Javed Multani

First set delegate

第一组委托

UIPickerViewDataSource,UIPickerViewDelegate

set IBOutlet for UIPickerView

为 UIPickerView 设置 IBOutlet

@IBOutlet weak var pickerView: UIPickerView!

Take an array for data

获取数据的数组

var arrayFruits = [String]()

Write this code on viewDidLoad()

在 viewDidLoad() 上编写此代码

  arrayFruits = ["Apple","Banana","Orange","Grapes","Watermelon"]
  self.pickerView.dataSource = self
  self.pickerView.delegate = self

Write picker view delegate methods:

编写选择器视图委托方法:

 //MARK: - Pickerview method
func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return arrayFruits.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return arrayFruits[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    self.labelFruit.text = arrayFruits[row]
}

enter image description here

在此处输入图片说明

100% working and tested

100% 工作和测试