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%工作和测试