Как обновить UIPickerview после изменения содержимого источника данных - PullRequest
0 голосов
/ 18 марта 2019

У меня есть 2 UIPickerViews в программе ios, которую я запускаю на симуляторе iPad. У них есть один компонент в каждом. Я нахожу соответствующий вид выбора, используя переключатель на теге. Два отдельных компонента должны быть изменены путем добавления или удаления компонентов. Это достаточно просто в источнике данных с pickerData.append(textInput) pickerData.sort() pickerData.reloadAllComponents а также pickerData.remove(at: lastDataSelected) picker.reloadAllComponents() где lastDataSelected - целое число строки.

Это работает для изменения источника данных, но не полностью при передаче в UIPickerViews. Дисплей UIPickerView не обновляется, пока я не прокручиваю вид. Чтобы быть более точным, выбранный элемент является правильным, но текстовая метка не обновляется. После прокрутки все метки данных отображаются корректно. Я попытался программно прокрутить от одного конца до другого, но это не помогает.

Так как я могу сказать программе обновлять представление без прокрутки пользователем? picker.reloadInputViews () не помогает.

Кроме того, количество элементов (строк) не изменяется, чтобы отразить изменения в данных средства выбора, поэтому последний элемент выпадает из списка при добавлении нового. Итак, второй вопрос - как заставить функции UIPickerView обновлять количество строк?

Мне не удалось найти никаких примеров динамически обновляемых представлений сборщика, поэтому надеюсь, что кто-нибудь может помочь или указать мне правильное направление. Я полагаю, что оставшийся код довольно стандартный, но в процессе обновления я что-то упускаю.

override func viewDidLoad() {
    super.viewDidLoad()
    flvPicker = UIPickerView()
    flvPicker.delegate = self
    flvPicker.dataSource = self
    flvPicker.tag = 0
}

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    switch pickerView.tag {
    case 0:
        return 1
    case 1:
        etc...
    }
}
var numberOfRowsInComponent = 0
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    switch pickerView.tag {
    case 0:
        return flvPickerData.count
    case 1:
        etc...
    }
}
func pickerView(_
    pickerView: UIPickerView,
                titleForRow row: Int, forComponent component: Int) -> String? {
    switch pickerView.tag {
    case 0:
        return flvPickerData[row]
    case 1:
        etc...
    }
}


func pickerView( _ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    switch pickerView.tag {
    case 0:
        flavourSelected = flvPickerData[row]
        lastFlavourSelected = row
    case 1: etc...
    }
}

Я думаю, что на самом деле вопрос заключается в том, как заставить UIPickerView корректно обновляться после внесения изменений в его источник данных и, следовательно, в число строк.

1 Ответ

0 голосов
/ 18 марта 2019

Вы можете использовать reloadComponent(_:) метод из UIPickerView.

...