UIPickerView в Swift - PullRequest
       2

UIPickerView в Swift

0 голосов
/ 26 января 2020

У меня есть метка, которую я хочу, чтобы программно добавить дату рождения от моего пользователя, мне удается заполнить данными, но я не могу извлечь данные правильно, вот мой код: эта ошибка показывает, что индекс находится вне диапазона и cra sh мое приложение

class SignUpFormViewController: UIViewController {

    let date = Date()
    let formatter = DateFormatter()
    let years = (1800...2100).map{String($0)}
    let days = (1...31).map{String($0)}
    var pickerMonth: [String] = [String]()
    var pickerDay: [String] = [String]()
    var pickYears: [String] = [String]()

    var selectedMonth: String?
    var selectedDay: String?
    var selectedYear: String?

//other stuff

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        handleGestureRecognizer()
        self.datePickerView.delegate = self
        self.datePickerView.dataSource = self
        datePickerComponents()
    }

}

extension SignUpFormViewController: UIPickerViewDelegate, UIPickerViewDataSource {

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 3
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

        if component == 0 {
            return pickerMonth.count//month
        }else if component == 1 {
            return pickerDay.count//day
        }else {
            return pickYears.count//year
        }
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {

        if component == 0 {
            return pickerMonth[row]
        }else if component == 1 {
            return pickerDay[row]
        }else {
            return pickYears[row]
        }
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

        birthDateTextField.text = "\(pickerMonth[row])/\(pickerDay[row])/\(pickYears[row])"
    }

    func datePickerComponents() {
        pickerMonth = formatter.shortMonthSymbols
        pickerDay = days
        pickYears = years
    }

}

1 Ответ

1 голос
/ 26 января 2020

Проблема здесь:

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    birthDateTextField.text = "\(pickerMonth[row])/\(pickerDay[row])/\(pickYears[row])"
}

Это слишком просто. Думаю об этом. Пользователь раскручивает только один компонент за раз, и ваш метод вызывается. Допустим, это годовой компонент, который крутил пользователь. У вас есть 300 из них. Так что row может быть 300 (скажем). Но у pickerMonth нет 300 месяцев! Таким образом, вы говорите sh, когда вы наивно говорите pickerMonth[row].

Что вы хотите сделать, это спросить сборщик, чтобы просмотреть, какая строка выбрана во всех трех компонентах, и использовать эту строку для этого компонент.

birthDateTextField.text = 
    pickerMonth[pickerView.selectedRow(inComponent:0)]
    + "/" + 
    pickerDay[pickerView.selectedRow(inComponent:1)]
    + "/" + 
    pickYears[pickerView.selectedRow(inComponent:2)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...