У меня есть UIPickerView с 2 компонентами. 1-й компонент - для районов, а 2-й - для городов. Когда я вращаю оба одновременно, я получаю Index out of range
и приложение вылетает. Я загружаю данные в словарь на viewDidLoad()
. В каждом районе есть несколько городов.
Реализация
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return PickerViewComponents.allCases.count
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
let componentName = PickerViewComponents.allCases[component]
switch componentName {
case .district:
return districts.count
case .cities:
let index = pickerView.selectedRow(inComponent: PickerViewComponents.district.rawValue)
let district = districts[index]
return districtsDict[district]!.count
}
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
let componentName = PickerViewComponents.allCases[component]
switch componentName {
case .district:
return districts[row]
case .cities:
let index = pickerView.selectedRow(inComponent: PickerViewComponents.district.rawValue)
let district = districts[index]
return districtsDict[district]?[row]
}
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
let componentName = PickerViewComponents.allCases[component]
if componentName == .district {
let cities = PickerViewComponents.cities.rawValue
pickerView.reloadComponent(cities)
pickerView.selectRow(0, inComponent: cities, animated: true)
} else {
let index = pickerView.selectedRow(inComponent: PickerViewComponents.district.rawValue)
let district = districts[index]
self.districtsTxtField.text = districtsDict[district]![row]
}
}
Обновление
Приложение вылетает при titleForRow
метод return districtsDict[district]?[row]
Это вызывает сбой приложения при вращении 1-го компонента, и пока он вращается, я не могу вращать второй одновременно. Конечно, это не обязательно. Но нужно ли предотвращать сбои приложения при этом? Есть ли способ это исправить?