неожиданно нашел нуль, разворачивая Необязательное значение keyboardWillShow

У меня есть этот код ниже, который запускается при вызове клавиатурыWillShowNotification:

func keyboardWillShow(_ notification: Notification) { //ERROR IN THE LINE BELOW keyboard = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as AnyObject).cgRectValue animaton = (notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as AnyObject).doubleValue UIView.animate(withDuration: 0.4, animations: { () -> Void in self.scrollView.frame.size.height = self.scrollViewHeight - self.keyboard.height }) } 

Во второй строке появляется сообщение об ошибке: unexpectedly found nil while unwrapping an Optional value . В принципе, всякий раз, когда я нажимаю на один из текстовых полей, это уведомление для клавиатуры будет вызываться и будет запускаться код в keyboardWillShow . Я знаю, что я поставил if...let заявления, но я хочу знать, почему я получаю нуль за это.

Я не уверен, как я получаю эту ошибку или как ее отлаживать. Это потому, что я запускаю его с симулятора?

Вот что печатает сообщение notification.userInfo:

Необязательно ([AnyHashable («UIKeyboardFrameEndUserInfoKey»): NSRect: {{0, 315}, {320, 253}}, AnyHashable («UIKeyboardIsLocalUserInfoKey»): 1, AnyHashable («UIKeyboardBoundsUserInfoKey»): NSRect: {{0, 0} , {320, 253}}, AnyHashable («UIKeyboardAnimationCurveUserInfoKey»): 7, AnyHashable («UIKeyboardCenterBeginUserInfoKey»): NSPoint: {160, 694.5}, AnyHashable («UIKeyboardCenterEndUserInfoKey»): NSPoint: {160, 441.5}, AnyHashable (" UIKeyboardFrameBeginUserInfoKey "): NSRect: {{0, 568}, {320, 253}}, AnyHashable (" UIKeyboardAnimationDurationUserInfoKey "): 0.25])

2 Solutions collect form web for “неожиданно нашел нуль, разворачивая Необязательное значение keyboardWillShow”

Из документов:

 let UIKeyboardFrameEndUserInfoKey: String 

Описание

Ключ для объекта NSValue, содержащий CGRect, который идентифицирует конечный кадр клавиатуры в экранных координатах

Ваш второй ключ:

 let UIKeyboardAnimationDurationUserInfoKey: String 

Описание Ключ для объекта NSNumber, содержащий двойной, который определяет продолжительность анимации в секундах.

Поэтому вам нужно перенести первый в NSValue, а второй – в NSNumber:

 func keyboardWillShow(_ notification: Notification) { print("keyboardWillShow") guard let userInfo = notification.userInfo else { return } keyboard = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue animaton = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber).doubleValue // your code } 

(Как исправить вашу проблему четко написано в ответе Лео Дабуса, поэтому я попытаюсь объяснить ошибку, которую я получал до того, как я добавил! ).

В Swift 3, as AnyObject стал одной из самых рискованных операций. Это связано с наихудшей новой функцией, называемой id-as-Any .

В этой строке вашего кода:

  keyboard = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as AnyObject).cgRectValue 

Тип выражения notification.userInfo?[UIKeyboardFrameEndUserInfoKey] – это Any? , Как вы видите, необязательный тип Any? не следует безопасно преобразовывать в необязательный AnyObject . Но Swift 3 конвертирует его с созданием необязательного _SwiftValue .

Вы можете проверить это поведение при вставке этого кода:

 print(type(of: notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as AnyObject)) 

Таким образом, вы пытаетесь применить .cgRectValue _SwiftValue .cgRectValue к _SwiftValue , что может ввести в заблуждение функцию Swift 3: «неявное преобразование типа _SwiftValue обратно в значение Swift».

Слишком долго …


НЕ используйте в as AnyObject кастинг в Swift 3

Interesting Posts

didSelectRowAtIndexPath не вызывается для UIButton для cellForRowAtIndex

нажатие кнопки в ячейке UITableview дает неверный результат при поиске

Преобразование NSValue обратно в тип структуры, который был сохранен в нем?

iOS: Как установить вспышку камеры включена, когда открыта камера?

MKAnnotationView всегда показывает infoButton вместо detailDisclosure btn

Есть ли еще 64 локальных предела уведомления для новых пользовательских уведомлений в iOS 10?

UITableView загружает эскизы изображений асинхронно с кешем

Преобразование String to Time Format возвращает nil Data

dispatch_semaphore_signal никогда не выполняется из-за ожидания

Parallax UIScrollView – обработка двух представлений одним методом scrollViewDidScroll?

didUpdateUserLocation не вызывается, когда view для userLocation является настраиваемым

iOS – Отправить push-уведомление в приложении XMPP chat, когда buddy отключен

как получить доступ из UICollectionViewCell indexPath ячейки в UICollectionView

Ошибка загрузчика приложения, двоичная.

Нельзя индексировать значение типа '?' с индексом типа 'Int'

PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.