Попытка перезагрузить все данные для средства выбора не работает - PullRequest
0 голосов
/ 18 июня 2019

Я разработал приложение, в котором у меня есть две метки, два вида выбора и сегментированная кнопка управления, которая меняет метки между 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]

        }
    }

1 Ответ

1 голос
/ 18 июня 2019

Вы можете попробовать это перезагрузить ваши компоненты и сбросить к первому элементу в массиве каждый раз, когда вы переключаете сегментированный элемент управления:

@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)
}
...