立即用 UIPickerView 选项填充 UITextField

Filling a UITextField with a UIPickerView option immediately

我的应用程序使用 UITextFields,其中填充了 UIPickerViews,如所附的屏幕截图。下面是如何设置的示例。

目前,当点击 UITextField 时,它会弹出 UIPickerView,但在滚动 UIPickerView 之前不会填充字段本身(例如,获取UITextField 在下面的示例中填充了 "Yes, surgery",用户必须先滚动到 "Yes, PCI <6h ago",然后再返回)。

如何在点击 UITextField 后立即使用 UIPickerView 的第一行来填充该字段?

let prevCardiacIntervPickerView = UIPickerView()  
prevCardiacIntervPickerView.delegate = self  
prevCardiacIntervPickerView.tag = 1  
prevCardiacIntervPickerField.inputView = prevCardiacIntervPickerView  
var prevCardiacIntervPickerOption = ["Yes, surgery", "Yes, PCI <6h ago", "Yes, PCI >6h ago", "No"]  
func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}  
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if pickerView.tag == 1 {
            return prevCardiacIntervPickerOption.count
        }
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView.tag == 1 {
            return prevCardiacIntervPickerOption[row]
        }
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if pickerView.tag == 1 {
            prevCardiacIntervPickerField.text = prevCardiacIntervPickerOption[row]
        }
}

您需要实施 textFieldShouldBeginEditing: 方法。

设置委托

yourTextfield.delegate = self

实现委托方法

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {


     if (textField == yourTextfield) {  

        // your logic goes here...
        yourTextfield.text = prevCardiacIntervPickerOption.first

     }

   return true
}

您可以修改以下函数为

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if row.index == 1 && textField.text.count == 0 {
            // set titleForRow to the UITextField
        }
        if pickerView.tag == 1 {
            return prevCardiacIntervPickerOption[row]
        }
}

检查如果 UITextfieldempty 并且 row.indexone 那么值titleForRow 应该填充到指定的 UITextfield

其他快速解决方案可能是,在 viewDidAppear 本身中用 prevCardiacIntervPickerOption[0] 填充 UITextField。但在这种情况下 UITextfield 将填充第一个数组元素的默认值。如果你想保持 UITextfield 空直到它被选中一次然后去第一个解决方案。

UITextField 与选择器相关联使用通常不是一个好主意,我的意思是,如果选项只能选择,那么为什么允许自由文本?您可以只使用可选择的行来打开选择器并使用默认值。

但是如果您需要这种确切的行为,我会在我的文本字段上设置一个委托,并在第一次按下时检查它是否为空:

self.myTextField.delegate = self

func textFieldDidBeginEditing(_ textField: UITextField) {
  if textField == myTextField && !textField.text {
     textField.text = pickerViewDataSource[0]
  }
}