ios swift:UIPickerView最佳实践?

解决了! 代码更新和工作! 非常感谢Alex Zimin!


一个简单的问题:在注册过程中,我想要求用户从值列表中select一个值。

这是正确的方式来使用视图控制器添加那里所有文本字段和值UIPickerView? 由于选取器视图需要在文本字段区域之间有这么多的空间,我不知道在这种情况下最好的做法是什么?

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

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() statusMessageLabel.hidden = true gradePicker = UIPickerView() gradePicker.dataSource = self gradePicker.delegate = self gradeTextField.inputView = gradePicker gradeTextField.text = gradePickerValues[0] } 

pickerview被隐藏在开始,只有当我select文本字段,这是很好的,但目前为止…但select器视图是空的…

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

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

希望这可以帮助。


更新

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

只要做: gradePicker.dataSource = selfviewDidLoad()

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


更新2

终于做到了。 如果您在textFiled的inputView中添加UIPickerView ,那么它不应该在IB中。 所以你可以从故事板(或.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] } }