UIPickerView 取决于第一个组件不会更新 UI



我想构建一个包含嵌套数据和 2 个组件的 UIPicker。第二个组件应取决于第一个组件的选择(例如,当选择的水果 ->显示香蕉,苹果...;当选择蔬菜 ->显示西红柿...)。

这有效,但第二个组件的 UI 不会直接更新。我必须点击第二个组件才能看到标题。我尝试在选择后更新组件(picker.reloadComponent(1))以及所有组件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 ""
    }
}

提前感谢!

Swift 4.2/xCode 10

您的代码工作正常。如果您的问题是您希望将第二个组件重新加载到其第一项,请在picker.reloadComponent(1)后尝试此操作:

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

否则,请更具体地说明问题。

最新更新