Тип 'NSNotification.Name' не имеет члена 'keyboardDidShowNotification'

Я получаю эту ошибку в Swift 4.2

Тип 'NSNotification.Name' не имеет члена 'keyboardDidShowNotification'

Вот мой код:

NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardDidShow(notification:)), name: NSNotification.Name.keyboardDidShowNotification, object: nil)

Следующий работал нормально со Swift 4, но не со Swift 4.2.

NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardDidShow(notification:)), name: NSNotification.Name.UIKeyboardDidShow, object: nil)

введите описание изображения здесь

Ссылка на документ Apple: NSNotification.Name.keyboardDidShowNotification


person Krunal    schedule 13.09.2018    source источник
comment
Как и в случае с вопросом о типе вашей кнопки ... @Krunal - это может быть полезно ... (не мое, и я не пробовал ... просто нашел через поиск): gist.github.com/benasher44/de0a75a4583e5f57853998142e795776   -  person DonMag    schedule 13.09.2018
comment
@DonMag - Спасибо за это. Это очень здорово. Но ищите патч / поддержку Swift4.2. Я переношу свой полный проект.   -  person Krunal    schedule 13.09.2018
comment
Конечно ... но эта суть может быть достойным справочником для подобных изменений синтаксиса. Что касается миграции всего проекта, в Xcode 10 действительно есть Помощник по миграции, который может помочь. Ссылка: swift.org/migration-guide-swift4.2   -  person DonMag    schedule 13.09.2018


Ответы (5)


Я считаю, что вы сейчас используете это вот так.

NotificationCenter.default.addObserver(
    self, 
    selector: #selector(self.keyboardDidShow(notification:)), 
    name: UIResponder.keyboardDidShowNotification, object: nil) 

/* You can substitute UIResponder with any of it's subclass */

Он указан в UIResponder документе как свойство типа .

person Rakesha Shastri    schedule 14.09.2018
comment
Странно, что .keyboardDidShowNotification встречается как в UIWindow, так и в UIResponder. - person rmaddy; 14.09.2018
comment
@rmaddy я получил это как предложение от xcode. Но когда я перехожу к документации на страницу уведомления, оно отображается под UIWindow. : / - person Rakesha Shastri; 14.09.2018
comment
Как ни странно, обе версии (UIWindow и UIResponder) компилируются. - person rmaddy; 14.09.2018
comment
@rmaddy, я узнал, почему я так думаю. Многие ключевые объекты также являются респондентами, включая объект UIApplication, объекты UIViewController и все объекты UIView (который включает UIWindow) developer.apple.com/documentation/uikit/uiresponder. - person Rakesha Shastri; 14.09.2018
comment
.keyboardDidShowNotification фактически должен быть объявлен в UIResponder, потому что я могу делать UIView.keyboardDidShowNotification или любой другой класс, который в конечном итоге происходит от UIResponder. - person rmaddy; 14.09.2018
comment
Я действительно смущен, почему наблюдатель UIResponder.keyboardWillShowNotification не вызывается. Я использую его внутри KeyboardViewController расширения клавиатуры. - person Amit Verma; 28.12.2019

Работаем на swift 4,2

 func bindToKeyboard(){
    NotificationCenter.default.addObserver(self, selector: #selector(UIView.keyboardWillChange(_:)), name:
        UIApplication.keyboardWillChangeFrameNotification
        , object: nil)


}
person Daniel    schedule 01.11.2018

К этому ответу были добавлены некоторые мелкие детали:

func setupViews(){
            // Keyboard notification observers
        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)

        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil) 
    }


    @objc func keyboardWillShow(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            // Do something
        }
    }

    @objc func keyboardWillHide(notification: NSNotification) {
        // Do something
    }
person fullmoon    schedule 24.12.2019

Я использовал только UIResponder.keyboardWillHideNotification, кроме NSNotification.Name.. Это работает в SWIFT 5

NotificationCenter.default.addObserver(self, selector: #selector(KeyboardLayoutConstraint.keyboardWillShowNotification(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
    
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHideNotification(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)

Когда я нажимаю команду keyboardWillShowNotification и выбираю переход к определению.

extension UIResponder {

    
    public class let keyboardWillShowNotification: NSNotification.Name

    public class let keyboardDidShowNotification: NSNotification.Name

    public class let keyboardWillHideNotification: NSNotification.Name

    public class let keyboardDidHideNotification: NSNotification.Name

}
person Rakshitha Muranga Rodrigo    schedule 04.05.2019

@Krunal .... удалите NSNotification.Name, он будет работать

person Kulpreet Singh    schedule 20.07.2021
comment
Это то же решение, что и в другом ответе. - person Eric Aya; 20.07.2021