Клавиатура не исчезает с 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)
    }
}

Заявление печати указывает, что textField является первым ответчиком. Я также пытался позвонить endEditing на родительские и модальные виды без эффекта.

Вот несколько скриншотов

Модал представлен правильно Клавиатура не прячется

2 ответа

Решение

Вы должны вернуть ложь на textFieldShouldBeginEditing

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

Мы можем скрыть представление ввода от UIViewController используя endEditing к объекту контроллера, как:

self.view.endEditing(true)

В вашем случае используйте:

controller.view.endEditing(true)
Другие вопросы по тегам