用于多 UITextField 的 UIPickerView

UIPickerView for Multi UITextField

我试图在一个视图中的每个文本字段中显示 UIPickerView。当我在第一个文本字段中选择值时,它强制第二个文本字段显示相同的值。

我正在尝试为每个设置不同的值。

@IBOutlet var gpaFieldOne: UITextField!
@IBOutlet var gpaFieldTwo: UITextField!
@IBOutlet var gpaResult: UILabel!

let picker = UIPickerView()
var grades = ["A","B","C","D","F"]

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

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

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

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    gpaFieldOne.text = grades[row]
    self.view.endEditing(false)
    gpaFieldTwo.text = grades[row]
    self.view.endEditing(false)
}

override func viewDidLoad() {
    super.viewDidLoad()

    picker.delegate = self
    picker.dataSource = self
    gpaFieldOne.inputView = picker
    gpaFieldTwo.inputView = picker
}

您的 didSelectRow 每次都设置两个文本字段。您只需要设置当前文本字段的 text,而不是两者。

您需要进行一些更改以跟踪当前文本字段。

首先添加一个新的 属性:

var currentTextField: UITextField?

确保设置两个文本字段的委托。在故事板中建立联系或在代码中设置它们(在 viewDidLoad 中)。

实施textFieldDidBeginEditing方法:

func textFieldDidBeginEditing(_ textField: UITextField) {
    currentTextField = textField
}

现在将您的 didSelectRow 更新为以下内容:

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    if let currentTextField = currentTextField {
        currentTextField.text = grades[row]
        currentTextField.resignFirstResponder()
        self.currentTextField = nil
    }
}