Нераспознанные селекторы отправляются на экземпляр, Центр уведомлений получает размер клавиатуры - PullRequest
0 голосов
/ 12 февраля 2019

Если я пытаюсь подключиться к своим текстовым полям, я получаю сообщение об ошибке, связанное с этими несколькими строками кода, которые пытаются определить размер клавиатуры на мобильном устройстве ios.Строки кода Центра уведомлений находятся внутри переопределенных ViewDidAppear.

 NotificationCenter.default.addObserver(self, selector: Selector(("keyboardWillShow:")), name: UIResponder.keyboardDidShowNotification, object: nil)

 NotificationCenter.default.addObserver(self, selector: Selector(("keyboardWillHide:")), name: UIResponder.keyboardDidHideNotification, object: nil)

func keyboardWillShow(notification: NSNotification) {
    if let userInfo = notification.userInfo {
        if let keyboardSize = (userInfo[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            self.bottomConstraint.constant = keyboardSize.height
        }
    }
}

func keyboardWillHide(notification: NSNotification) {
    self.bottomConstraint.constant = 0

}

Ответы [ 6 ]

0 голосов
/ 12 февраля 2019

Используйте синтаксис типа safe

#selector(keyboardWillShow)

и

@objc func keyboardWillShow(_ notification: Notification) { ...

Однако я настоятельно рекомендую использовать современный синтаксис на основе замыканий

NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillShowNotification, object: nil, queue: .main) { [weak self] notification in
    if let userInfo = notification.userInfo,
       let keyboardSize = (userInfo[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            self?.bottomConstraint.constant = keyboardSize.height
    }
}
NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillHideNotification, object: nil, queue: .main) { [weak self] _ in
    self?.bottomConstraint.constant = 0
}
0 голосов
/ 12 февраля 2019

Вы получили эту ошибку из-за параметра уведомления.С текущей подписью вы должны использовать:


#selector(keyboardWillShow(notification:))
#selector(keyboardWillHide(notification:))

Или переписать ваши методы таким образом:


@objc func keyboardWillShow(_ notification: Notification) {
    // Code
}

@objc func keyboardWillHide(_ notification: Notification) {
    // Code
}

И использовать следующий синтаксис:


#selector(keyboardWillShow(_:))
#selector(keyboardWillHide(_:))

Отредактировано:

Вы также можете использовать упрощенный синтаксис:


#selector(keyboardWillShow)
#selector(keyboardWillHide)

0 голосов
/ 12 февраля 2019

Вы должны отменить регистрацию любого уведомления, зарегистрированного в представлении.

func registerForKeyboardNotifications()
 {
      //Adding notifies on keyboard appearing
      NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
      NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillBeHidden(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)
 }


 func deRegisterFromKeyboardNotifications()
 {
       //Removing notifies on keyboard appearing
       NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
       NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
 }

 @objc func keyboardWasShown(_ notification: NSNotification)
 { 
     //todo
 }

 @objc func keyboardWillBeHidden(_ notification: NSNotification)
 { 
      //todo
 }

 override func viewDidLoad() {
     super.viewDidLoad()
     registerForKeyboardNotifications()
}

override func viewDidDisappear(_ animated: Bool) {
     super.viewDidDisappear(animated)
     deRegisterFromKeyboardNotifications()
}
0 голосов
/ 12 февраля 2019

Вы можете попробовать это:

Этот код в viewDidLoad():

// Do any additional setup after loading the view.
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)

и затем добавить это в ViewController

@objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
         print("Keyboard opened \(keyboardSize)")
    }
}

@objc func keyboardWillHide(notification: NSNotification) {
    print("Keyboard hide")
}

Надеюсь, что это будетпомощь.

0 голосов
/ 12 февраля 2019

Попробуйте следующий код:

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)

}

@objc func keyboardWillShow(notification: Notification) {
    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        print("notification: Keyboard will show")
    }

}

@objc func keyboardWillHide(notification: Notification) {
    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {

    }
}
0 голосов
/ 12 февраля 2019

Используйте, как показано ниже код

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

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

@objc func keyboardWillHide(notification: NSNotification) {
     // Your code
}

Надеюсь, что это работает, если есть сомнения, пожалуйста, комментарий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...