Проблема с использованием двух UIPickerViews - первый работает, второй нет - PullRequest
0 голосов
/ 15 июня 2019

Я пытаюсь использовать два вида выбора в двух разных текстовых полях (я выравниваю их под текстовыми полями и скрываю до тех пор, пока они не будут вызваны). Я скрываю окна выбора до тех пор, пока не буду готов к использованию, и свяжу оба текстовых поля с соответствующими текстовыми полями. Первый просмотрщик работает нормально, но когда я нажимаю на второй, мой список не появляется, и он все еще скрыт. Я прочитал код несколько раз и не могу найти проблему, и посмотрел несколько видео и проверил документацию яблок безрезультатно. Код размещен ниже для просмотра и помощи. Заранее спасибо!

class fifthViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate {

    @IBOutlet weak var heightInput: UITextField!
    @IBOutlet weak var weightInput: UITextField!
    @IBOutlet weak var bmiOutput: UITextField!
    @IBOutlet weak var weightPicker: UIPickerView!
    @IBOutlet weak var heightPicker: UIPickerView!

    var height = ["48", "49", "50"]
    var weight = ["90", "91", "92"]

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        var countrows : Int = height.count
        if pickerView == weightPicker {
        countrows = self.weight.count
        }
        return countrows
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView == heightPicker {
        let titleRow = height[row]
            return titleRow
        }
        else if pickerView == weightPicker {
            let titleRow = weight[row]
            return titleRow
        }
        return ""
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if pickerView == heightPicker {
            self.heightInput.text = self.height[row]
            self.heightPicker.isHidden = true
        }
        else if pickerView == weightPicker {
            self.weightInput.text = self.weight[row]
            self.weightPicker.isHidden = true
        }
    }

    func textFieldDidBeginEditing(_ textField: UITextField) {
        if (textField == self.heightInput) {
            self.heightPicker.isHidden = false
        }
        else if (textField == self.weightInput) {
            self.weightInput.isHidden = false
        }
    }```

1 Ответ

0 голосов
/ 15 июня 2019

В textFieldDidBeginEditing() вам нужно установить self.weightPicker.isHidden на false вместо self.weightInput.isHidden.

func textFieldDidBeginEditing(_ textField: UITextField) {
    if (textField == self.heightInput) {
        self.heightPicker.isHidden = false
    }
    else if (textField == self.weightInput) {
        self.weightPicker.isHidden = false
    }
}

Измените код, чтобы использовать inputView s

Я согласен с комментарием @ PaulW11:

"Вам было бы почти наверняка лучше, если вы сделаете так, чтобы средство выбора просматривало входное представление каждого текстового поля."

Вот изменения, необходимые для базовой настройки.Избавьтесь от сборщиков в раскадровке и отключите соединения @IBOutlet.

Затем добавьте следующие модификации:

// These are no longer outlets since they're created in code
var weightPicker: UIPickerView!
var heightPicker: UIPickerView!

override func viewDidLoad() {
    super.viewDidLoad()

    // set up the picker views
    self.weightPicker = UIPickerView()
    self.weightPicker.delegate = self
    self.weightPicker.dataSource = self

    self.heightPicker = UIPickerView()
    self.heightPicker.delegate = self
    self.heightPicker.dataSource = self

    self.heightInput.inputView = self.heightPicker
    self.weightInput.inputView = self.weightPicker
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    if pickerView == heightPicker {
        self.heightInput.text = self.height[row]

        // make picker go away after value has been selected
        self.heightInput.resignFirstResponder()
    }
    else if pickerView == weightPicker {
        self.weightInput.text = self.weight[row]

        // make picker go away after value has been selected
        self.weightInput.resignFirstResponder()
    }
}
...