swift - 尝试重新加载pickerview的所有数据不起作用
问题描述
我开发了一个应用程序,其中有两个标签、两个选择器视图和一个分段控制按钮,用于更改英制和公制之间的标签,并且基于该标签,每个选择器视图中将加载不同的数组。目前这一切都有效。我遇到的问题是因为每个pickerview都是一个重量和高度的数组,当用户按下分段控制按钮来更改测量类型时,它会更改第二个数组的索引值。例如,如果我目前在英制刻度上并且我选择 105(从 100 开始),如果我切换到公制,它会添加正确的数组但它会自动将我的起始编号增加 5 的索引(我的起始编号之间的差异number 和我从 pickerview 中选择的数字,反之亦然。
这是我的选择器代码:
@IBAction func selectorChoice(_ sender: Any) {
if selectorLabel.selectedSegmentIndex == 0 {
heightPicker.reloadAllComponents()
weightPicker.reloadAllComponents()
heightLabel.text = "Height (in)"
weightLabel.text = "Weight (lbs)"
weightInput.text = "100"
heightInput.text = "48"
UserDefaults.standard.set(selectorLabel.selectedSegmentIndex, forKey: "stateSelected")
UserDefaults.standard.set(heightLabel.text!, forKey: "height")
UserDefaults.standard.set(weightLabel.text!, forKey: "weight")
}
else if selectorLabel.selectedSegmentIndex == 1 {
heightPicker.reloadAllComponents()
weightPicker.reloadAllComponents()
heightLabel.text = "Height (cm)"
weightLabel.text = "Weight (kgs)"
weightInput.text = "45"
heightInput.text = "121"
UserDefaults.standard.set(selectorLabel.selectedSegmentIndex, forKey: "stateSelected")
UserDefaults.standard.set(heightLabel.text!, forKey: "height")
UserDefaults.standard.set(weightLabel.text!, forKey: "weight")
}
}
选择器查看代码:
var height = (48...96).map(String.init)
var weight = (100...350).map(String.init)
var heightCM = (121...244).map(String.init)
var weightKG = (45...159).map(String.init)
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
var countrows : Int = height.count
if pickerView == weightPicker && weightLabel.text == "Weight (lbs)" {
countrows = self.weight.count
}
else if pickerView == weightPicker && weightLabel.text == "Weight (kgs)"
{
countrows = self.weightKG.count
}
return countrows
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if weightLabel.text == "Weight (lbs)" {
if pickerView == heightPicker {
let titleRow = height[row]
return titleRow
} else if pickerView == weightPicker {
let titleRow = weight[row]
return titleRow
}
return ""
} else if weightLabel.text == "Weight (kgs)" {
if pickerView == heightPicker {
let titleRow = heightCM[row]
return titleRow
}
else if pickerView == weightPicker {
let titleRow = weightKG[row]
return titleRow
}
return ""
}
return ""
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if pickerView == heightPicker && heightLabel.text == "Height (in)" {
self.heightInput.text = self.height[row]
}
else if pickerView == weightPicker && weightLabel.text == "Weight (lbs)" {
self.weightInput.text = self.weight[row]
}
else if pickerView == heightPicker && heightLabel.text == "Height (cm)" {
self.heightInput.text = self.heightCM[row]
}
if pickerView == weightPicker && weightLabel.text == "Weight (kgs)" {
self.weightInput.text = self.weightKG[row]
}
}
解决方案
每次切换分段控件时,您可以尝试重新加载组件并重置为数组中的第一个元素:
@IBAction func segmented(_ sender: UISegmentedControl) {
if sender.selectedSegmentIndex == 0 {
heightLabel.text = "Height (in)"
weightLabel.text = "Weight (lbs)"
} else {
heightLabel.text = "Height (cm)"
weightLabel.text = "Weight (kgs)"
}
heightPicker.reloadAllComponents()
weightPicker.reloadAllComponents()
heightPicker.selectRow(0, inComponent: 0, animated: true)
weightPicker.selectRow(0, inComponent: 0, animated: true)
}
推荐阅读
- sql - “SQL 命令未正确结束” - 插入语句
- three.js - Determine base line performance before running? - ThreeJS
- javascript - 在哪里存储身份验证令牌(前端)以及如何将其放入多个端点的 http 标头中?
- python - 如何操作内置的类型提示
- c# - 基础连接已关闭。无法使用 HTTP.sys 运行 Asp.Net core 2.1 web api 应用程序?
- python - 如何生成RGB图像的颜色直方图?
- r - 如何用空列表初始化 data.table 列并循环它?
- qt - 如何限制屏幕中的 Qt 窗口?
- go - 带有 go-swagger 响应标头的 GoLang
- php - PHP open_basedir 限制:(文件)不在允许的路径内