Проблема с добавлением второго UIPickerView в том же представлении ViewController - PullRequest
0 голосов
/ 22 апреля 2019

По сути, я просто хочу добавить второй UIPickerView в мой ViewController, но не понимаю, почему следующий код работает правильно.

При выборе второго текстового поля stopTextField Я ожидаю stopPicker UIPickerView появляется, но вместо этого появляется все тот же gradePicker UIPickerView.

Кажется, что компилируется нормально, но полностью игнорирует:

let stopPickerValues = ["What Stop?","Stop 1", "Stop 2", "Stop 3", "Stop 4", "Stop 5", "Stop 6", "Stop 7", "Stop 8", "Stop 9", "Stop 10"]

В чем проблема?

Вот код:

import UIKit

class timeselectviewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
    @IBOutlet weak var gradeTextField: UITextField!
    @IBOutlet weak var stopTextField: UITextField!


    var gradePicker: UIPickerView!
    var stopPicker: UIPickerView!

    let gradePickerValues = ["select approximate arrival time","8:00 am -12:00 pm", "12:00 pm - 4:00 pm", "4:00 pm - 8:00 pm"]

    let stopPickerValues = ["What Stop?","Stop 1", "Stop 2", "Stop 3", "Stop 4", "Stop 5", "Stop 6", "Stop 7", "Stop 8", "Stop 9", "Stop 10"]

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

    func numberOfComponents2(in pickerView2: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
        return gradePickerValues.count
    }

    func pickerView2(_ pickerView2: UIPickerView, numberOfRowsInComponent2 component2: Int) -> Int{
        return stopPickerValues.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return gradePickerValues[row]
    }

    func pickerView2(_ pickerView2: UIPickerView, titleForRow2 row2: Int, forComponent2 component2: Int) -> String? {
        return stopPickerValues[row2]
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        gradeTextField.text = gradePickerValues[row]
        self.view.endEditing(true)
    }

    func pickerView2(_ pickerView2: UIPickerView, didSelectRow2 row2: Int, inComponent2 component2: Int) {
        stopTextField.text = stopPickerValues[row2]
        self.view.endEditing(true)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        gradePicker = UIPickerView()
        stopPicker = UIPickerView()
        gradePicker.dataSource = self
        stopPicker.dataSource = self
        gradePicker.delegate = self
        stopPicker.delegate = self

        stopTextField.inputView = stopPicker
        gradeTextField.inputView = gradePicker
        gradeTextField.text = gradePickerValues[0]
        stopTextField.text = stopPickerValues[0]
    }
}

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

Я согласен с ответом @ajeferson, но если вы все еще хотите использовать оба представления выбора, попробуйте следующее:

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{

    if pickerView == gradePicker{

       return gradePickerValues.count

    }
    else{

       return stopPickerValues.count

    }
}

Оба метода делегата и источника данных предоставляют каждый объект UIPickerView, поэтому мы можем использовать их по своему желанию.

0 голосов
/ 22 апреля 2019

Вы можете сделать это:

var pickerView: UIPickerView!

...


func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
  if gradeTextField.isFirstResponder {
    return gradePickerValues.count
  } else {
    return stopPickerValues.count
  }
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
  if gradeTextField.isFirstResponder {
    return gradePickerValues[row]
  } else {
    return stopPickerValues[row]
  }
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
  if gradeTextField.isFirstResponder {
    gradeTextField.text = gradePickerValues[row]
  } else {
    stopTextField.text = stopPickerValues[row]
  }
  self.view.endEditing(true)
}

override func viewDidLoad() {
  super.viewDidLoad()

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

  stopTextField.inputView = pickerView
  gradeTextField.inputView = pickerView
  gradeTextField.text = gradePickerValues[0]
  stopTextField.text = stopPickerValues[0]
}

Дело в том, что ваши pickerView2 методы просто игнорируются.Таким образом, я опубликовал выше, проверяет, какое текстовое поле является первым респондентом, который выполняет необходимые действия или возвращает правильные значения.

РЕДАКТИРОВАТЬ

Как указал rmaddy, вынужен только один вид сборщика, поскольку в качестве первого респондента можно использовать только одно текстовое поле.

...