立即用 UIPickerView 选项填充 UITextField
Filling a UITextField with a UIPickerView option immediately
我的应用程序使用 UITextField
s,其中填充了 UIPickerView
s,如所附的屏幕截图。下面是如何设置的示例。
目前,当点击 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]
}
}
检查如果 UITextfield
还 empty 并且 row.index
是 one 那么值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]
}
}
我的应用程序使用 UITextField
s,其中填充了 UIPickerView
s,如所附的屏幕截图。下面是如何设置的示例。
目前,当点击 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]
}
}
检查如果 UITextfield
还 empty 并且 row.index
是 one 那么值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]
}
}