UIPickerView в зависимости от первого компонента не обновляет интерфейс - PullRequest
0 голосов
/ 03 февраля 2019

Я хочу построить UIPicker с вложенными данными и 2 компонентами.2-й компонент должен зависеть от выбора 1-го компонента (например, когда выбранные фрукты -> показать банан, яблоко ...; когда выбранные овощи -> показать помидоры ...).

Это работает, но пользовательский интерфейс 2-го компонента не обновляется напрямую.Я должен нажать на 2-й компонент, чтобы увидеть заголовки.Я попытался обновить Компонент (picker.reloadComponent(1)), а также AllComponents picker.reloadAllComponents() после выбора.

Есть идеи?

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {

    @IBOutlet weak var picker: UIPickerView!

    var plants = [Dictionary<String, Any>]()
    var groups:[String] = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()

        plants.append([
            "name": "Fruits",
            "groups": [
                "Banana",
                "Apple"
            ]
        ])
        plants.append([
            "name": "Veggies",
            "groups": [
                "Tomatoe",
                "Salad",
                "Cucumber"
            ]
        ])

        if plants[0]["groups"] != nil {
            groups = plants[0]["groups"] as! Array
        }

        picker.delegate = self
        picker.dataSource = self
    }

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

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if component == 0 {
            return plants.count
        } else if component == 1 {
            return groups.count
        }

        return 0
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if component == 0 {
            // Update groups array, based on selection
            if plants[row]["groups"] != nil {
                groups = plants[row]["groups"] as! Array
            }

            picker.reloadComponent(1) //also tried picker.reloadAllComponents() here
        }
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if component == 0 {
            if plants[row]["name"] != nil {
                return plants[row]["name"] as! String
            }
        } else if component == 1 {
            // return values of current group
            return groups[row]
        }

        return ""
    }
}

Заранее спасибо!

1 Ответ

0 голосов
/ 03 февраля 2019

Swift 4.2 / xCode 10

Ваш код работает нормально.Если ваша проблема заключается в том, что вы хотите, чтобы второй компонент был перезагружен в его первый элемент, попробуйте это после picker.reloadComponent(1):

picker.selectRow(0, inComponent: 1, animated: true)

В противном случае, пожалуйста, будьте более конкретны о проблеме.

...