键盘不会随着 resignFirstResponder 消失

Posted

技术标签:

【中文标题】键盘不会随着 resignFirstResponder 消失【英文标题】:Keyboard doesn't go away with resignFirstResponder 【发布时间】:2018-05-04 19:42:28 【问题描述】:

我有一个视图控制器,它要求用户选择几件事情。直接使用 UIPickerView 是行不通的,因为它们占用了太多空间。因此,我有几个 UITextField,当用户选择一个时,它会弹出一个模态视图控制器。到目前为止它工作正常,除非已经有一个可见的键盘。发生这种情况时,会显示模态视图控制器,但它会被之前的键盘覆盖。这个键盘似乎没有连接到任何 UITextField,因为按下它的键不会导致字符出现在任何 UITextField 中。虽然文本字段中确实出现了闪烁的光标。

protocol ModalPickerTarget 
    var cancelCallback: (() -> Void)?  set get 
    var selectCallback: ((String) -> Void)?  set get 


class ModalPicker<T> where T: UIViewController, T: ModalPickerTarget 
    weak var controller: UIViewController!
    weak var textField: UITextField!

    init(textField: UITextField, controller: UIViewController) 
        self.controller = controller
        self.textField = textField
        textField.addTarget(self, action: #selector(ModalPicker.show), for: .editingDidBegin)
    

    @objc func show(sender: AnyObject) 
        var modal = T()

        print("First responder: \(self.textField.isFirstResponder)")
        self.textField.resignFirstResponder()
        modal.modalPresentationStyle = .overCurrentContext
        modal.modalTransitionStyle = .crossDissolve

        modal.cancelCallback = 
            modal.dismiss(animated: true, completion: nil)
        

        modal.selectCallback = 
            modal.dismiss(animated: true, completion: nil)
            self.textField.text = $0
        

        self.controller.present(modal, animated: true, completion: nil)
    

打印语句表明textField 是第一响应者。我还尝试在父视图和模态视图上调用 endEditing,但没有任何效果。

这里是一些屏幕截图

【问题讨论】:

【参考方案1】:

你必须在 textFieldShouldBeginEditing 上返回 false

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool 
    // Implement your Picker there
  return false

【讨论】:

【参考方案2】:

我们可以通过对控制器对象使用 endEditing 来隐藏 UIViewController 的输入视图,如下所示:

self.view.endEditing(true)

在你的情况下,使用:

controller.view.endEditing(true)

【讨论】:

以上是关于键盘不会随着 resignFirstResponder 消失的主要内容,如果未能解决你的问题,请参考以下文章

键盘解雇的 resignFirstResponder 与 endEditing

resignFirstResponder 不关闭键盘

iPhone:为啥发送消息 resignFirstResponder 会删除键盘?

iPhone 键盘、完成按钮和 resignFirstResponder

resignFirstResponder 无法关闭我在 iPad 上的自定义键盘。为啥?

resignFirstResponder 不关闭 UITextField 的 ASCII 键盘