Клавиатура не исчезает с resignFirstResponder - PullRequest
0 голосов
/ 04 мая 2018

У меня есть контроллер представления, который требует, чтобы пользователь выбрал несколько вещей. Использование 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 для родительского и модального представлений без эффекта.

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

Modal presented properly Keyboard not hiding

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

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

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    // Implement your Picker there
  return false
}
0 голосов
/ 04 мая 2018

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

self.view.endEditing(true)

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

controller.view.endEditing(true)
...