Dynami c PickerView с несколькими компонентами: индекс вне диапазона - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть PickerView с 3 компонентами на основе этого кода . Два средства выбора справа меняют свое содержимое на основе предыдущего выбора слева. К сожалению, приложение аварийно завершает работу, когда я заменяю родительский инструмент выбора на другой с меньшим количеством строк, чем в предварительном просмотре: ? Неустранимая ошибка: индекс выходит за пределы диапазона.

GIF of the current state and crash

Я попытался вернуть сборщик детей на первую позицию после выбора другого сборщика, но это не сработало. (Пожалуйста, смотрите под didSelectRow

У вас есть другая идея?

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

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

    if component == 0 {
        return countries.count
    } else if component == 1 {
        let selectedCountry = pickerView.selectedRow(inComponent: 0)
        return countries[selectedCountry].cities.count
    } else {
        let selectedCountry = pickerView.selectedRow(inComponent: 0)
        let selectedCity = pickerView.selectedRow(inComponent: 1)
        return countries[selectedCountry].cities[selectedCity].posts.count
    }
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    if component == 0 {
        return countries[row].name
    } else if component == 1{
        let selectedCountry = pickerView.selectedRow(inComponent: 0)
        return countries[selectedCountry].cities[row].name
    } else {
        let selectedCountry = pickerView.selectedRow(inComponent: 0)
        let selectedCity = pickerView.selectedRow(inComponent: 1)
        return countries[selectedCountry].cities[selectedCity].posts[row]
    }
}


func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    pickerView.reloadAllComponents()
    if component == 0 {
        pickerView.selectRow(0, inComponent: 1, animated: true)
        pickerView.selectRow(0, inComponent: 2, animated: true)
    } else if component == 1 {
        pickerView.selectRow(0, inComponent: 2, animated: true)
    }
}

Error Message

1 Ответ

0 голосов
/ 18 апреля 2020

Когда вы вызываете reloadAllComponents() в вашем didSelectRow, вы еще не обновили выбранные строки, поэтому он падает.

Измените порядок вокруг, и все должно быть в порядке.

Сброс значения 1-го компонента UIPickerView при изменении компонента 0 также может представлять интерес.

Примечание pickerView.reloadAllComponents() не является строго необходимым, как указано в посте выше , Вы можете просто перезагрузить те, которые нужно изменить.

Также предложение: ваш код будет легче читать / поддерживать, если вы используете, скажем, enum для организации ваших компонентов, так что вместо if component == 0 вы могли бы иметь if componentType == .country (или, еще лучше, switch), например.

...