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