неожиданно нашел нуль, разворачивая Необязательное значение 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

как создать кнопку возврата в панели навигации

UIScrollView не прокручивается при касании подпрограммы GADBannerView

Выбор текста PDF на iOS

Как создать данные структуры, глобально доступные в одноэлементном классе в swift 2.0 (iOS)?

Когда использовать развернутые опции как часть определения типа

UITableView отскакивает назад в начало раздела при вызове reloadRowsAtIndexPaths

Почему UIViewController затрагиваетBegan, затрагиваетMoved & touchesEnded, только вызывается, когда начинается первое из двух касаний, перемещается или заканчивается?

Как сохранить токен доступа LinkedIn с помощью IOS SDK?

Sqlite.swift не работает с Xcode 7.3

Прокрутите через subview, чтобы проверить наличие пустого UITextField – Swift

форматирование объекта NSDate изменяет часовой пояс

PhoneGap 3.0.0 Ориентация блокировки

Почему tableview отлично работает на симуляторе iOS 6+, но в симуляторе iOS 5 он выходит из строя

Вставка данных из текстовых полей в базу данных SQLite

Получение индивидуального использования аккумулятора для iOS

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