UIPickerView 最佳实践?

UIPickerView best practice?

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

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

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

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]

}

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

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

如果屏幕有多个字段,用户应该操作,那么,在我看来,最好把 label + button 放在上面,当用户按下这个 button你只是从屏幕底部显示 Picker View。当用户 select Picker View 中的任何行更改标签文本,但不隐藏选择器本身时,应该通过按 "Done" button 来完成。

希望这对您有所帮助。


更新:

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

只需做: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]
    }
}

第一次设置代表

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% 工作并经过测试