Martin Q
Martin Q

Reputation: 403

No Method declared with Objective-C Selector for Notification UIKeyboardWillShowNotification and UIKeyboardWillHideNotification

After the recent update of Xcode, this code that used to work no longer works. Most of the Selector(":") has an auto correction with the exception for this code:

override func viewDidLoad() {
    super.viewDidLoad()

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

which flags an error:

No method declared with Objective C selector 'keyboardWillSHow:'

This image show different attempts which have all failed.

enter image description here

What is the new syntax for this code?

Upvotes: 5

Views: 6026

Answers (5)

andreacipriani
andreacipriani

Reputation: 2591

Swift 3 example:

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

// MARK: - Actions

@objc private func keyboardWillShow(notification: Notification) {
    print("keyboardWillShow called")
}

@objc private func keyboardWillHide(notification: Notification) {
    print("keyboardWillHide called")
}

Upvotes: 2

Surpher
Surpher

Reputation: 537

Swift 3 syntax (just like Sohil's above):

    func someMethod(sender: Any?) {
      ...
    }

    func someBlockCallingWithSelector() {
      someObject.addTarget(self, action: #selector(someMethod), for: .valueChanged) 
    }

Upvotes: 0

roger
roger

Reputation: 68

I have had same issues and also find out that the class you refer on must also be subclassed from NSObject (which is not necc. the case in Swift) Otherwise you get the message

error: argument of '#selector' refers to instance method 'yourMethod(notification:)' that is not exposed to Objective-C"

Upvotes: 0

Sohel L.
Sohel L.

Reputation: 9540

Assign the Selector as below:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(YourClassName.keyboardWillShow(_:)), name:UIKeyboardWillShowNotification, object: nil);

And the method to update what you want:

func keyboardWillShow(notification: NSNotification) {

     //Update UI or Do Something

}

Same way you can do for UIKeyboardWillHideNotification.

Upvotes: 11

Andrew McKinley
Andrew McKinley

Reputation: 1137

The swift syntax changed. Try this:

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

Upvotes: 0

Related Questions