Я динамически заполняю UIScrollView
многими полями UITextField
во время выполнения.У меня проблема в том, что клавиатура будет скрывать поля, которые находятся в той области, где она появится, это может включать поле, которое я редактирую.
Я попытался KeyboardManagement решение отДокументация Apple, а также пробовал с уведомлениями на textFieldDidBeginEditing
и textFieldDidEndEditing
, но проблема в обоих случаях заключается в том, что уведомление keyboardWillShow
иногда появляется первым, и в этом случае оно не дает мне знать, какое поле являетсяОтредактировано.
У меня есть этот код в классе, который реализует протокол UITextFieldDelegate
, каждый объект этого класса содержит ссылку на одно из этих полей и работает как его делегат
func textFieldDidBeginEditing(_ textField: UITextField) {
self.activeTextfield = self.valueTextField
}
func textFieldDidEndEditing(_ textField: UITextField) {
self.activeTextfield = nil
}
Переменная activeTextfield
является слабой ссылкой на переменную в UIViewController
, где все это происходит.В этом контроллере представления у меня есть следующий код
class MyClass: UIViewController {
var activeTextfield: CustomTextField! // This is the variable I was talking about on the previous paragraph
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
NotificationCenter.default.removeObserver(self)
}
@objc func keyboardWillShow(_ notification: Notification) {
if self.view.frame.origin.y == 0 {
guard let userInfo = notification.userInfo else { return }
guard let keyboardSize = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { return }
let keyboardFrame = keyboardSize.cgRectValue
let textFieldFrame = activeTextfield!.frame // activeTextfield sometimes is nil because this notification happens before the previous code block
if textFieldFrame.origin.y + textFieldFrame.size.height > keyboardFrame.origin.y {
self.view.frame.origin.y -= keyboardFrame.height
}
}
}
@objc func keyboardWillHide(_ notification: Notification) {
if self.view.frame.origin.y != 0 {
guard let userInfo = notification.userInfo else { return }
guard let keyboardSize = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { return }
let keyboardFrame = keyboardSize.cgRectValue
self.view.frame.origin.y += keyboardFrame.height
}
}
}
Есть ли способ заставить методы делегирования UITextField
вызываться до уведомления клавиатуры?
Это правильный путь?справиться с такой ситуацией?
Если нет, как мне справиться с этим?
Спасибо