Ios 更改UIPickerview后如何更新它';s数据源内容
我在一个ios程序中有2个UIPickerViews,我正在iPad模拟器上运行。 它们每一个都有一个组件。 我通过使用标签上的开关找到相关的选择器视图。需要通过添加或删除组件来更改两个单组件视图。 在数据源中,使用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
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()}
将确保它在主线程上运行,并立即显示更新。