Подтвердить что ты не робот

Ios swift: лучшая практика UIPickerView?

РЕШИТЬ! Код обновляется и работает! Большое спасибо Alex Zimin!


Один короткий вопрос: в процессе регистрации я хотел бы попросить пользователя выбрать значение из списка значений.

Правильно ли использовать контроллер вида, добавляющий туда все текстовые поля и для значений 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 скрыта в начале и появляется только тогда, когда я выбираю текстовое поле, это прекрасно до сих пор... Но представление выбора не пуст...

4b9b3361

Ответ 1

Это зависит от внешнего вида контроллера. Если на экране будет только одно действие, то лучше поставить Table View на него, а выбранная строка будет текущей.

Если на экране есть многократные поля, с которыми должен действовать пользователь, то, на мой взгляд, лучше разместить над ним label + button, а когда пользователь нажмет этот button, вы просто покажете Picker View с экрана дно. Когда пользователь выбирает любую строку в Picker View, вы меняете текст ярлыка, но не скрываете сам сборщик, это нужно сделать, нажав "Done" button, который вы разместили выше.

Надеюсь, что это поможет.


Обновление

Ваша проблема, потому что вы просто забыли установить dataSource свойство UIPickerView

Просто выполните: gradePicker.dataSource = self в viewDidLoad()

И не забудьте реализовать здесь протокол: class RegisterViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource


Обновление 2:

Наконец сделал. Если вы добавите UIPickerView в inputView вашего textFiled, тогда он НЕ должен быть в 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]
    }
}