pickerView didSelectRow вводит в неправильный UITextField - PullRequest
0 голосов
/ 13 апреля 2019

Я пытаюсь следовать следующему решению , чтобы иметь несколько UIPickerViews на одном UIViewController.Они предполагают наличие тега для каждого поля UIText, которое я сделал и могу реализовать количество строк, заголовок для строки и количество компонентов.Однако я столкнулся с камнем преткновения при реализации строки действительно выбора.Когда я выбираю UITextField, он выделяет другое поле UIText.Ниже приведен код, который у меня есть.class DriverViewController: UIViewController {

var selectedTrack: String?

var firstDriver: String?

var secondDriver: String?

var thirdDriver: String?
let  tracks = ["Melbourne", "Manama", "Shanghai", "Baku",
               "Barcelona", "Monaco", "Montreal","Le Castellet","Spielberg",
               "Silverstone","Hockenheim","Budapest","Francorchamps","Monza","Singapore","Sochi","Suzuka","Austin","Interlagos","Abu Dhabi"]
let drivers = ["Lewis Hamilton","Antonio Giovinazzi","Kimi Raikkonen","Charles Leclerc","Sebastian Vettel","Romain Grosjean","Kevin Magnussen","Lando Norris",
               "Carlos Sainz","Valtteri Bottas","Sergio Perez","Lance Stroll","Pierre Gasly","Max Verstappen","Nico Hulkenberg","Daniel Ricciardo","Alexander Albon","Daniil Kvyat","Robert Kubica","George Russell"]
@IBOutlet weak var TrackTextField: UITextField!


@IBOutlet weak var firstTextField: UITextField!

@IBOutlet weak var secondTextField: UITextField!


@IBOutlet weak var thirdTextField: UITextField!


override func viewDidLoad() {
    super.viewDidLoad()


    createTrackPicker()
    createDriverPicker()
    createToolBar()
    // Do any additional setup after loading the view.
}

func createTrackPicker() {
    let trackPicker = UIPickerView()
    trackPicker.tag = 0
    trackPicker.delegate = self
    TrackTextField.inputView = trackPicker
}

func createDriverPicker() {
    let driverPicker = UIPickerView()
    driverPicker.tag = 1
    driverPicker.tag = 2
    driverPicker.tag = 3
    driverPicker.delegate = self
    firstTextField.inputView = driverPicker
    secondTextField.inputView = driverPicker
    thirdTextField.inputView = driverPicker
}

func createToolBar() {

    let toolBar = UIToolbar()
    toolBar.sizeToFit()
    let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(ViewController.dismissKeyboard))
    toolBar.setItems([doneButton], animated: false)
    toolBar.isUserInteractionEnabled = true
    TrackTextField.inputAccessoryView = toolBar
    firstTextField.inputAccessoryView = toolBar
    secondTextField.inputAccessoryView = toolBar
    thirdTextField.inputAccessoryView = toolBar

}
@objc func dismissKeyboard() {
    view.endEditing(true)
}
/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // Get the new view controller using segue.destination.
    // Pass the selected object to the new view controller.
}
 */

}

 extension DriverViewController: UIPickerViewDelegate, UIPickerViewDataSource {
 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    if pickerView.tag == 0 {
        return tracks.count
    } else {
        return drivers.count
    }
}


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

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    if pickerView.tag == 0 {
        return "\(tracks[row])"
    } else {
        return "\(drivers[row])"
    }
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    if pickerView.tag == 0 {
        selectedTrack = tracks[row]
        TrackTextField.text = selectedTrack
    } else if pickerView.tag == 1 {
        firstDriver = drivers[row]
        firstTextField.text = firstDriver
    } else if pickerView.tag == 2 {
        secondDriver = drivers[row]
        secondTextField.text = secondDriver
    } else if pickerView.tag == 3 {
        thirdDriver = drivers[row]
        thirdTextField.text = thirdDriver
    }
  }
}

Вот как это выглядит на экране. Simulator Screenshot

1 Ответ

1 голос
/ 13 апреля 2019

Посмотрите на свою функцию:

func createDriverPicker() {
    let driverPicker = UIPickerView()
    driverPicker.tag = 1
    driverPicker.tag = 2
    driverPicker.tag = 3
    driverPicker.delegate = self
    firstTextField.inputView = driverPicker
    secondTextField.inputView = driverPicker
    thirdTextField.inputView = driverPicker
}

Подумайте, какое значение имеет свойство tag после запуска этого кода, имея в виду, что оно может иметь только одно значение.

Youлибо нужно обновлять свойство tag представления средства выбора каждый раз, когда текстовое поле начинает редактирование, либо вам следует отказаться от использования тега и просто проверить, какое текстовое поле в настоящее время является первым респондентом.См. UIPickerView для каждого текстового поля с различными массивами (Swift / Firebase) для примера того, как это делается.

...