UIPickerview最佳实践?

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

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

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

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

pickerview在开头隐藏,只在我选择文本字段时出现,到目前为止这很好……但是选择器视图是空的……

控制器视图与打开的选择器视图

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

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

希望这可以帮助。


更新

您的问题是因为您忘记设置UIPickerView dataSource属性

只需: viewDidLoad() gradePicker.dataSource = self

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


更新2

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

然后将代码更改为:

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

首先设置代表

 UIPickerViewDataSource,UIPickerViewDelegate 

为UIPickerView设置IBOutlet

 @IBOutlet weak var pickerView: UIPickerView! 

获取数据数组

 var arrayFruits = [String]() 

在viewDidLoad()上写这段代码

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

写选择器视图委托方法:

  //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] } 

在此处输入图像描述

100%工作和测试