我在iPad模拟器上运行的ios程序中有2个UIPickerViews。它们每个都有一个组件。我通过在标签上使用开关来找到相关的选择器视图。需要通过添加或删除组件来更改这两个单个组件视图。在具有pickerData.append(textInput)
pickerData.sort()
pickerData.reloadAllComponents
和pickerData.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在对其数据源和行数进行更改后正确更新。
发布于 2019-03-18 08:46:21
您可以在UIPickerView
中使用reloadComponent(_:)
方法。
发布于 2021-05-22 14:04:12
有点晚了,但是如果您想要更新一个选取器视图,还有一个方法selectRow
。这还具有动画属性的好处,因此您可以为任何更新设置动画。
示例:
for (index, day) in weeklyOptions[0].enumerated() {
if scheduledTime.contains(day) {
weeklyDatePicker.selectRow(index, inComponent: 0, animated: true)
}
}
https://stackoverflow.com/questions/55213398
复制相似问题