Сбросить значение 1-го компонента UIPickerView при изменении компонента 0 - PullRequest
0 голосов
/ 28 апреля 2019

Я не могу понять, как сбросить в компонент 0 массив, использованный в первом компоненте PickerView, при изменении компонента 0 (во избежание возможных ошибок из-за indexOutOfRange).

Это структура моих данных

let bananas = ["banana1", "banana2"]
let fruitArray = ["banana1" : ["cherry1","cherry2"], "banana2" : ["cherry1", "cherry2", "cherry3"]]


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

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    if component == 0 {
        return bananas.count
    }
    else {
        let selectedBanana = pickerView.selectedRow(inComponent: 0)
        return fruitArray[banana[selectedBanana]]!.count
    }
}

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


    let selectedBanana = pickerView.selectedRow(inComponent: 0)
    let selectedCherry = pickerView.selectedRow(inComponent: 1)


    bananaPicked = bananas[selectedBanana]
    cherryPicked = fruitArray[bananaPicked]![selectedCherry]


    pickerView.reloadAllComponents() 
    }


func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if component == 0 {
    return bananas[row]
}
else {
    let selectedBanana = pickerView.selectedRow(inComponent: 0)
    return fruitArray[selectedBanana]![row]
}
}

Прямо сейчас, когда я (скажем) на banana2 и cherry3, но я переключаюсь на banana1, я получаю ошибку indexOutOfRange, потому что, конечно, в первом массиве бананов нет третьего элемента. Я желаю, чтобы банановый ряд менялся, чтобы сбросить до 0 вишневый ряд.

__________ ОБНОВЛЕНИЕ ______________ Это еще одна ошибка, из-за которой обнаружил сбой (indexOutOfRange), я выложил скриншот.

Image causing Crash

1 Ответ

1 голос
/ 29 апреля 2019

Установите для выбранной строки значение 0 в компоненте 1 при изменении компонента 0.

Кроме того, нет необходимости перезагружать все компоненты. Только компонент 1 нуждается в перезагрузке.

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

    if component == 0 {
        pickerView.selectRow(0, inComponent: 1, animated: false)
    }

    let selectedBanana = pickerView.selectedRow(inComponent: 0)
    let selectedCherry = pickerView.selectedRow(inComponent: 1)

    bananaPicked = bananas[selectedBanana]
    cherryPicked = fruitArray[bananaPicked]![selectedCherry]

    //pickerView.reloadAllComponents()
    pickerView.reloadComponent(1)
}

Для вашего второго сбоя, попробуйте некоторое защитное программирование, чтобы избежать сбоя:

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    if component == 0 {
        return bananas[row]
    }
    else {
        let selectedBanana = pickerView.selectedRow(inComponent: 0)
        let rowData = fruitArray[bananas[selectedBanana]]!
        if rowData.indices.contains(row) {
            return rowData[row]
        } else {
            return nil
        }
    }
}
...