Я разработал приложение, в котором у меня есть две метки, два вида выбора и сегментированная кнопка управления, которая меняет метки между Imperial и Metric и, основываясь на этой метке, разные массивы будут загружаться в каждом окне выбора. Это в настоящее время все работает. Проблема, с которой я сталкиваюсь, состоит в том, что каждый вид сборщика представляет собой массив веса и роста, когда пользователь нажимает сегментированную кнопку управления, чтобы изменить тип измерения, он меняет значение индекса 2-го массива. Например, если я в настоящее время нахожусь в имперском масштабе и выбираю 105 (начинается с 100), если я переключаюсь на метрику, это добавляет правильный массив, НО это автоматически увеличивает мое начальное число на индекс 5 (разница между моим начальным) номер и номер, который я выбрал в окне выбора, и наоборот.
Вот мой код селектора:
@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]
}
}