【问题标题】:Keyboard getting displayed sometimes in textfield picker view in iOS键盘有时会显示在 iOS 的文本字段选择器视图中
【发布时间】:2023-04-11 02:33:01
【问题描述】:

我有一个文本字段,点击它会显示UIPickerView。我将其添加为文本字段的inputView。有时当我点击文本字段时,它会显示键盘而不是选择器视图。我添加了一个自定义类,它也继承了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 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 中的所有文本字段设置 inputView。

标签: ios swift keyboard uitextfield uipickerview


【解决方案1】:

将这些行放在 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

}

【讨论】:

  • 我有三个文本字段monthTextFieldyearTextFieldstateTextField。所以这使得其他 UIPickerView 元素不显示。
  • 将委托分配给您的文本字段,并在 shouldBeginEditing 检查文本字段并将这些行改为它们。 activePickerType = PickerType.year viewDatePicker(textField)
  • 如果我不提供textField.inputView = pickerView 并点击第二个文本字段,我会收到Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'child view controller:<UICompatibilityInputViewController: 0x10ea104a0> should have parent view controller:<App.CalendarViewController: 0x10695c200> but requested parent is:<UIInputWindowController: 0x106a44a00>' 错误。
  • 它工作正常。我在textField.inputView 中分配了错误的控制。谢谢。
【解决方案2】:

在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
    // ...
}

【讨论】:

  • 当我检查它时,我的情况下没有显示键盘。还有什么您在问题中没有提到并且您正在使用的东西吗?
  • 它适用于上述答案。请检查更新的代码。我主要是在第一次点击文本字段值时显示键盘。
  • 它适用于上述答案。请检查更新的代码。我主要是在第一次点击文本字段值时显示键盘。
猜你喜欢
  • 2020-10-27
  • 1970-01-01
  • 2017-03-15
  • 2015-08-20
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 2018-07-01
  • 1970-01-01
相关资源
最近更新 更多