У меня был viewController с несколькими текстовыми полями. Затем, через некоторое время, я обнаружил, что на самом деле нет способа превратить textFields в многострочные (чертовски глупо, если вы спросите меня!).
Итак, я изменил все textFields на textViews, чтобы у пользователя была возможность написать несколько строк. Теперь, до того, как у меня было много кода, объединенного с этими textFields, из-за сложности перемещения textField вверх и вниз в соответствии с keyboardSize и т. Д.
Странно то, что я подумал, что могу просто поменять все слова «textField» на textView - и тогда клавиатура будет вести себя так же. Я не могу Вот мой код (изменен, чтобы попытаться подогнать мои новые textViews вместо старых textFields):
override func viewDidLoad() {
super.viewDidLoad()
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector: #selector(keyboardDidShow), name: UIResponder.keyboardWillShowNotification, object: nil)
notificationCenter.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}
@objc func keyboardDidShow(notification: NSNotification) {
let info:NSDictionary = notification.userInfo! as NSDictionary
let keyboardSize = (info[UIResponder.keyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
let keyboardY = self.view.frame.height - keyboardSize.height
let editingTextFieldY:CGFloat! = self.activeTextView.frame.origin.y
if self.view.frame.origin.y >= 0 {
// Checking if the textfield is really being hidden:
if editingTextFieldY > keyboardY - 60 {
UIView.animate(withDuration: 0.25, delay: 0.0, options: UIView.AnimationOptions.curveEaseIn, animations: {
self.view.frame = CGRect(x: 0, y: self.view.frame.origin.y - (editingTextFieldY - (keyboardY - 60)), width: self.view.bounds.width, height: self.view.bounds.height)
}, completion: nil)
} } }
@objc func keyboardWillHide(notification: NSNotification) {
UIView.animate(withDuration: 0.25, delay: 0.0, options: UIView.AnimationOptions.curveEaseIn, animations: {
self.view.frame = CGRect(x: 0, y: 0, width: self.view.bounds.width, height: self.view.bounds.height)
}, completion: nil)
}
Приложение компилируется нормально, но когда я нажимаю любой textView для ввода ввода, вместо всплывающей клавиатуры, приложение вылетает, и я получаю: «Поток 1: Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения».
Это появляется в строке 'let keyboardSize = ...'
Кто-нибудь может увидеть мою ошибку? Или скажите мне другой способ перемещения представления в соответствии с клавиатурой - при работе с textViews, а не textFields?
И еще одно замечание ... Может кто-нибудь объяснить мне, почему существуют и textField, и textView? Почему, во имя Бога, яблоко не может просто соединить это воедино? ..
Спасибо заранее! :)