Swift 3 NSNotificationCenter Keyboardwillshow/hide

RubberDucky4444 picture RubberDucky4444 · Jun 15, 2016 · Viewed 24.4k times · Source

I have a piece of code that worked in Swift 2 and I tried using Xcode to update the code to the newest version and I fixed everything except two issues.

I have this 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)

That pairs along with this:

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()
    }
}

On the first part I now get an error saying

Type 'LoginViewController' has no member 'keyboardWillShow/Hide'

I don't understand why it is not seeing the method underneath.

Does anybody know a solution to this issue?

Answer

Lucas picture Lucas · Jun 15, 2016

Check out the updated Swift Programming Language book. Pages 1027 and 1028 are what you're looking for. It should be something like this:

func keyboardWillHide(_ notification: NSNotification) {…

Notice the additional underscore above. Also:

#selector(LoginViewController.keyboardWillHide(_:))

You also might need to add @objc(keyboardWillHideWithNotification:) to your class.