键盘不会随着resignFirstResponder而消失

时间:2018-05-04 19:42:28

标签: ios swift uiviewcontroller resignfirstresponder

我有一个视图控制器,需要用户选择几个东西。直接使用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)
    }
}

print语句表明textField是第一个响应者。我也尝试在父视图和模态视图上调用endEditing而没有任何效果。

以下是一些屏幕截图

Modal presented properly Keyboard not hiding

2 个答案:

答案 0 :(得分:2)

您必须在textFieldShouldBeginEditing

上返回false
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    // Implement your Picker there
  return false
}

答案 1 :(得分:0)

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

self.view.endEditing(true)

在您的情况下,请使用:

controller.view.endEditing(true)