web-dev-qa-db-fra.com

Swift 3 NSNotificationCenter Keyboardafficher / masquer

J'ai un morceau de code qui fonctionnait en Swift 2 et j'ai essayé d'utiliser Xcode pour mettre à jour le code vers la dernière version et j'ai tout résolu sauf deux problèmes.

J'ai ce code:

let loginvc: LoginVC = self.storyboard?.instantiateViewController(withIdentifier: "LoginVC") as! LoginVC
NotificationCenter.defaultCenter().addObserver(self, selector: #selector(LoginViewController.keyboardWillShow(_:)), name: UIKeyboardWillShowNotification, object: nil)
NotificationCenter.defaultCenter().addObserver(self, selector: #selector(LoginViewController.keyboardWillHide(_:)), name: UIKeyboardWillHideNotification, object: nil)

Cela va de pair avec ceci:

func keyboardWillShow(notification: NSNotification) {

    constraint.constant = -100
    UIView.animate(withDuration: 0.3) {
        self.view.layoutIfNeeded()
    }
}

func keyboardWillHide(notification: NSNotification) {

    constraint.constant = 25
    UIView.animate(withDuration: 0.3) {
        self.view.layoutIfNeeded()
    }
}

Sur la première partie, je reçois maintenant une erreur disant

Le type "LoginViewController" n'a aucun membre "keyboardWillShow/Hide"

Je ne comprends pas pourquoi il ne voit pas la méthode en dessous.

Quelqu'un connaît-il une solution à ce problème?

10
RubberDucky4444

Consultez la mise à jour livre Swift Programming Language . Les pages 1027 et 1028 sont ce que vous recherchez. Cela devrait être quelque chose comme ceci:

func keyboardWillHide(_ notification: NSNotification) {…

Notez le soulignement supplémentaire ci-dessus. Aussi:

#selector(LoginViewController.keyboardWillHide(_:))

Vous devrez peut-être également ajouter @objc(keyboardWillHideWithNotification:) à votre classe.

9
Lucas

Sur Swift 4.2, le nom addObserver pour NSNotificationCenter a également changé:

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

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: UIResponder.keyboardDidHideNotification, object: nil)
5
Ricardo Isidro

Utilisez ce code qui fonctionne sur Swift3

Vous pouvez utiliser votre ViewController (par exemple, loginvc) pour ajouter une notification

let loginvc : LoginVC = self.storyboard?.instantiateViewController(withIdentifier: "LoginVC") as! LoginVC

    NotificationCenter.default.addObserver(self,
        selector: #selector(loginvc.keyboardWillShow(notification:)),
        name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self,
        selector: #selector(loginvc.keyboardWillHide(notification:)),
        name: NSNotification.Name.UIKeyboardWillHide, object: nil)

Ensuite, ajoutez la méthode de masquage et d'affichage du clavier

func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        print("Show") 
    }
}
func keyboardWillHide(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        print("Hide")
    }
}
4
Harshad Patel

NSNotificationCenter change les choses pour le clavier get show:

NotificationCenter.default.addObserver(self, selector: #selector(NovaVisitaVC.abreTeclado(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)

NotificationCenter.default.addObserver(self, selector: #selector(NovaVisitaVC.abreTeclado(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
1
Pablo Ruan