Как писать клавиатурные уведомления в Swift 3

Я пытаюсь обновить этот код, чтобы быстро 3:

NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name: UIKeyboardWillShowNotification, object: nil)

NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name: UIKeyboardWillHideNotification, object: nil)`

Пока что я только что попробовал автокоррекции, предоставленные компилятором. В результате получается такой код:

let notificationCenter = NotificationCenter.default()
notificationCenter.addObserver(self, selector: Selector(("keyboardWillShow:")), name: NSNotification.Name.UIKeyboardWillShow, object: nil)

notificationCenter.addObserver(self, selector: Selector(("keyboardWillHide:")), name: NSNotification.Name.UIKeyboardWillHide, object: nil)`

К сожалению, это не займет у меня много времени, что приведет к дополнительным ошибкам.

Кто-нибудь решил это, пожалуйста?

Обратите внимание, что я просто пытаюсь написать уведомление. Я (пока) не пытаюсь исправить функции уведомлений .. Спасибо

 David DelMonte17 июн. 2016 г., 10:28
Немного по-другому - упомянутый вопрос касается функций отображения / скрытия клавиатуры. Этот вопрос о настройке уведомлений.
 LC 웃17 июн. 2016 г., 10:07
 LC 웃17 июн. 2016 г., 10:29
хорошо, дайте мне знать, если это не помогло
 David DelMonte17 июн. 2016 г., 10:33
Спасибо Аниш, я все еще пытаюсь понять, как писать уведомления сами.

Ответы на вопрос(7)

Swift 4.2 Xcode 10 (10L213o)

Основные изменения по сравнению со Swift 3 заключаются вUIWindow. keyboardWillShowNotification а такжеUIWindow.keyboardWillShowNotification

let notifier = NotificationCenter.default
notifier.addObserver(self,
                     selector: #selector(KeyboardLayoutConstraint.keyboardWillShowNotification(_:)),
                     name: UIWindow.keyboardWillShowNotification,
                     object: nil)
notifier.addObserver(self,
                     selector: #selector(KeyboardLayoutConstraint.keyboardWillHideNotification(_:)),
                     name: UIWindow.keyboardWillHideNotification,
                     object: nil)


@objc
func keyboardWillShowNotification(_ notification: NSNotification) {}

@objc
func keyboardWillHideNotification(_ notification: NSNotification) {}
 fssilva09 июн. 2019 г., 18:10
Спасибо что подметил это. Это фиксированная.
 David DelMonte24 июл. 2018 г., 19:25
Вы уверены, что набрали их правильно? Оба говорятUIWindow.keyboardWillShowNotification

Вы можете заменить устаревший строковый литералSelector с проверенным типом#selector(Class.method) пара:

let center = NotificationCenter.default
center.addObserver(self,
                   selector: #selector(keyboardWillShow(_:)),
                   name: .UIKeyboardWillShow,
                   object: nil)

center.addObserver(self,
                   selector: #selector(keyboardWillHide(_:)),
                   name: .UIKeyboardWillHide,
                   object: nil)

#selector Синтаксис намного безопаснее, так как Swift может проверить во время компиляции, что указанный метод действительно существует.

Для получения дополнительной информации о селекторах Swift см.подробный ответ Рикстера.

 Sami07 янв. 2017 г., 19:53
Круто, я просто использовал это! Дополнительное примечание на случай, если кто-то запустит мою проблему: при реализацииkeyboardWillShow иkeyboardWillHide, не делайте их приватными функциями, иначе у вас будет ошибка компилятора.
Решение Вопроса

Swift 4

override func viewDidLoad() {
    super.viewDidLoad()   
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

func keyboardWillShow(notification: NSNotification) {
     print("keyboardWillShow")
}

func keyboardWillHide(notification: NSNotification){
     print("keyboardWillHide")
}

Вы также можете получить информацию о клавиатуре ниже кода внутри этих методов.

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange), name: .UIKeyboardWillChangeFrame, object: nil) .      

@objc func keyboardWillChange(notification: NSNotification) {
     let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
     let curve = notification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! UInt
     let curFrame = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
     let targetFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
     let deltaY = targetFrame.origin.y - curFrame.origin.y
 }
 Michael Hsu06 мая 2018 г., 03:43
Это лучше использоватьUIKeyboardDidShow скорее, чемUIKeyboardWillShowили это в принципе одно и то же?
 David DelMonte25 янв. 2018 г., 19:48
Спасибо! Я собирался пересмотреть мой вопрос.
 ZAFAR00710 мая 2018 г., 10:58
@MichaelHsu Это зависит от вас. Если вам нужно вызвать функцию до появления клавиатуры, тогда вы можете использоватьkeyboardWillShow метод в противном случае вы можете использоватьUIKeyboardDidShow который будет вызывать после появления клавиатуры
 nja17 сент. 2018 г., 17:09
Хотя это решение работает, стоит упомянуть, что вам нужно удалить наблюдателя уведомлений в viewWillDisappear, чтобы избежать утечки памяти. Просто добавьте:override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) NotificationCenter.default.removeObserver(self) }
 Dan Rosenstark13 мая 2018 г., 15:37
@MichaelHsu очень редко, что вы хотите использоватьdidShow; Вы обычно хотите, чтобы ваша клавиатура избегала анимации и копировала кривую анимации и продолжительность клавиатуры.

Вы можете выполнить уведомление клавиатуры с обеих версий Swift соответственно.

Добавить Objserver:

NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidShow), name: .UIKeyboardWillShow, object: nil)

Вызов функции Swift 3

func keyboardDidShow() {
          print("keyboardDidShow")
       }

Функция вызова In Swift 4

@objc func keyboardDidShow() {
      print("keyboardDidShow")
   }
 Suresh Durishetti08 янв. 2018 г., 10:31
Почему мы должны использовать ключевое слово @objc для работы? есть ли способ чистого быстрого кода для 4?
 Tech07 февр. 2018 г., 07:39
Когда метод keyboardDidShow вызывается из Objective C, swift 4 настаивает на добавлении ключевого слова @objc перед вызовом метода.

Для Swift 4.2.UIKeyboardWillShow переименован вUIResponder.keyboardWillShowNotification а также.UIKeyboardWillHide переименован вUIResponder.keyboardWillHideNotification

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

   @objc func NameOfSelector() {
       //Actions when notification is received
    }

Я исправил эту проблему, написав такой код

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil)

В Swift 3.0

 override func viewDidLoad()
    {
        super.viewDidLoad()
 NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)

}

Keybord Показать и Скрыть

func keyboardWillShow(notification: NSNotification) 
{

      // Your Code Here
}

func keyboardWillHide(notification: NSNotification)
{  
   //Your Code Here     
}

Ваш ответ на вопрос