ios - 更改数据源内容后如何更新 UIPickerview
问题描述
我在 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 在更改其数据源并因此更改行数后正确更新。
解决方案
您可以使用reloadComponent(_:)
方法 from UIPickerView
。
推荐阅读
- react-native - 如何初始化堆栈导航器?
- node.js - 一旦发送了错误的凭证,Express 服务器就会崩溃
- c++ - 如何在单独的 *.cpp 文件中定义类模板的成员函数?
- java - 包火花不存在
- java - 具有自定义目录结构的 Apache Tomcat 日志
- javascript - 管道 ReadableStream 进行转换
- reactjs - React.js 身份验证问题,即使我得到了令牌
- json - 如何用 jq 解析这个包含布尔值的 JSON 输出?
- c - 如何配置代码块以在 Ubuntu 上使用 raylib?
- .htaccess - 如何停止重写以强制 https 影响所有子域