Ios 更改UIPickerview后如何更新它';s数据源内容

Ios 更改UIPickerview后如何更新它';s数据源内容,ios,swift,xcode,ios-simulator,Ios,Swift,Xcode,Ios Simulator,我在一个ios程序中有2个UIPickerViews,我正在iPad模拟器上运行。 它们每一个都有一个组件。 我通过使用标签上的开关找到相关的选择器视图。需要通过添加或删除组件来更改两个单组件视图。 在数据源中,使用 pickerData.append(textInput) pickerData.sort() pickerData.reloadAllComponents 和 pickerData.remove(在:lastDataSelected时) picker.reloadAllCompon

我在一个ios程序中有2个UIPickerViews,我正在iPad模拟器上运行。 它们每一个都有一个组件。 我通过使用标签上的开关找到相关的选择器视图。需要通过添加或删除组件来更改两个单组件视图。 在数据源中,使用
pickerData.append(textInput)
pickerData.sort()
pickerData.reloadAllComponents
pickerData.remove(在: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中的
reloadComponent(:)
方法,但如果您想更新picker视图,还有方法
selectRow
。这还具有动画属性的优点,因此可以为任何更新设置动画

例如:

for (index, day) in weeklyOptions[0].enumerated() {
    if scheduledTime.contains(day) {
        weeklyDatePicker.selectRow(index, inComponent: 0, animated: true)
    }
}

这不起作用,但flvPicker.reloadAllComponents()也不起作用。列表会像以前一样更新,滚动后可见,但行数保持不变,因此添加项目时最后一个项目会从列表中滚出来“'row'是一个'let'常量,即不可变,因此无法将其更新为新的行数。这是UIPickerViewDelegate协议的一部分,有什么方法可以解决此问题吗?”?有什么方法可以重新初始化选择器视图吗?只需调用
reloadComponent(:)
reloadcomponents()
就可以了。另外,请确保您在主线程上调用了它。(
DispatchQueue.main.async{}
)。是的,
reloadAllComponents()
应该可以工作。使用
DispatchQueue.main.async{self.flvPicker.reloadAllComponents()}
将确保它在主线程上运行,并立即显示更新。