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