如何在更改UIPickerview的数据源内容后更新UIPickerview

问题描述 投票:0回答:1

我在ios程序中有2个UIPickerViews,我在iPad模拟器上运行。它们各有一个组件。我通过使用标签上的开关找到相关的选择器视图。需要通过添加或删除组件来更改两个单组件视图。这在数据源中很容易使用pickerData.append(textInput) pickerData.sort() pickerData.reloadAllComponentspickerData.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的数据源并因此更改行数后让UIPickerView正确更新。

ios swift xcode ios-simulator
1个回答
0
投票

你可以使用reloadComponent(_:)UIPickerView方法。

© www.soinside.com 2019 - 2024. All rights reserved.