iOS 的文本字段选择器视图中有时会显示键盘
Keyboard getting displayed sometimes in textfield picker view in iOS
我有一个文本框,点击它会显示 UIPickerView
。我将其添加为文本字段的 inputView
。有时,当我点击文本字段时,它会显示键盘而不是选择器视图。我已经添加了一个自定义 class,subclass 也是 UITextField
。
override func viewDidLoad() {
// ...
monthTextField.addTarget(self, action: #selector(monthTextFieldDidTap), for: UIControl.Event.touchDown)
}
@objc func monthTextFieldDidTap(textField: UITextField) {
activePickerType = PickerType.month
viewDatePicker(textField)
}
@objc func yearTextFieldDidTap(textField: UITextField) {
activePickerType = PickerType.year
viewDatePicker(textField)
}
func viewDatePicker(_ textField: UITextField) {
self.datePicker = UIPickerView.init(frame: CGRect.init(x: 0, y: 0, width: self.navigationController!.view.frame.size.width, height: 216))
self.datePicker.delegate = self
self.datePicker.dataSource = self
textField.inputView = self.datePicker
// ...
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if (textField == monthTextField) {
return true
}
return false
}
UITextField
的自定义子class:
class PickerTextField: UITextField {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func caretRect(for position: UITextPosition) -> CGRect {
return CGRect.zero
}
func selectionRects(for range: UITextRange) -> [Any] {
return []
}
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
UIMenuController.shared.isMenuVisible = false
self.resignFirstResponder()
return false
}
}
如何确保在点击 UITextField
时不显示键盘并始终显示 UIPickerView
?
将这些行放在 viewDidLoad 而不是 monthTextFieldDidTap 中
self.datePicker = UIPickerView.init(frame: CGRect.init(x: 0, y: 0, width: self.navigationController!.view.frame.size.width, height: 216))
self.datePicker.delegate = self
self.datePicker.dataSource = self
monthTextField.inputView = self.datePicker
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
if (textField == monthTextField) {
activePickerType = PickerType.month
viewDatePicker(textField)
}
return true
}
在 monthTextFieldDidTap(textField: UITextField) 函数中添加 self.view.endEditing() 行,如下所示:
@objc func monthTextFieldDidTap(textField: UITextField) {
self.view.endEditing(true)
monthTextField.tintColor = UIColor.clear //optional to use. It just removes cursor blinking on picker Textfield
self.datePicker = UIPickerView.init(frame: CGRect.init(x: 0, y: 0, width: self.navigationController!.view.frame.size.width, height: 216))
self.datePicker.delegate = self
self.datePicker.dataSource = self
textField.inputView = self.datePicker
// ...
}
我有一个文本框,点击它会显示 UIPickerView
。我将其添加为文本字段的 inputView
。有时,当我点击文本字段时,它会显示键盘而不是选择器视图。我已经添加了一个自定义 class,subclass 也是 UITextField
。
override func viewDidLoad() {
// ...
monthTextField.addTarget(self, action: #selector(monthTextFieldDidTap), for: UIControl.Event.touchDown)
}
@objc func monthTextFieldDidTap(textField: UITextField) {
activePickerType = PickerType.month
viewDatePicker(textField)
}
@objc func yearTextFieldDidTap(textField: UITextField) {
activePickerType = PickerType.year
viewDatePicker(textField)
}
func viewDatePicker(_ textField: UITextField) {
self.datePicker = UIPickerView.init(frame: CGRect.init(x: 0, y: 0, width: self.navigationController!.view.frame.size.width, height: 216))
self.datePicker.delegate = self
self.datePicker.dataSource = self
textField.inputView = self.datePicker
// ...
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if (textField == monthTextField) {
return true
}
return false
}
UITextField
的自定义子class:
class PickerTextField: UITextField {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func caretRect(for position: UITextPosition) -> CGRect {
return CGRect.zero
}
func selectionRects(for range: UITextRange) -> [Any] {
return []
}
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
UIMenuController.shared.isMenuVisible = false
self.resignFirstResponder()
return false
}
}
如何确保在点击 UITextField
时不显示键盘并始终显示 UIPickerView
?
将这些行放在 viewDidLoad 而不是 monthTextFieldDidTap 中
self.datePicker = UIPickerView.init(frame: CGRect.init(x: 0, y: 0, width: self.navigationController!.view.frame.size.width, height: 216))
self.datePicker.delegate = self
self.datePicker.dataSource = self
monthTextField.inputView = self.datePicker
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
if (textField == monthTextField) {
activePickerType = PickerType.month
viewDatePicker(textField)
}
return true
}
在 monthTextFieldDidTap(textField: UITextField) 函数中添加 self.view.endEditing() 行,如下所示:
@objc func monthTextFieldDidTap(textField: UITextField) {
self.view.endEditing(true)
monthTextField.tintColor = UIColor.clear //optional to use. It just removes cursor blinking on picker Textfield
self.datePicker = UIPickerView.init(frame: CGRect.init(x: 0, y: 0, width: self.navigationController!.view.frame.size.width, height: 216))
self.datePicker.delegate = self
self.datePicker.dataSource = self
textField.inputView = self.datePicker
// ...
}