UIPickerview最佳实践? [英] UIPickerview best practice?

查看:106
本文介绍了UIPickerview最佳实践?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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]

}

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

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...

< img src =https://i.stack.imgur.com/RWP0H.pngalt =带有打开的选择器视图的控制器视图>

推荐答案

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

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

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

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

希望这有帮助。

更新

您的问题,因为您忘了设置 dataSource UIPickerView的属性

Your problem because you just forget to set dataSource property of UIPickerView

只需执行: gradePicker.dataSource = self in viewDidLoad()

并且不要忘记在此实现协议:类RegisterViewController:UIViewController,UIPickerViewDelegate,UIPickerViewDataSource

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

更新2

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

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

然后将代码更改为:

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

这篇关于UIPickerview最佳实践?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆