2016-04-01 9 views
5

Nach der letzten Aktualisierung von Xcode funktioniert dieser Code, der früher funktionierte nicht mehr. Die meisten der Selector („:“) verfügt über eine automatische Korrektur mit Ausnahme für diesen Code:Keine Methode mit Objective-C-Selektor für die Benachrichtigung UIKeyboardWillShowNotification und UIKeyboardWillHideNotification

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

welche einen Fehler markiert:

No method declared with Objective C selector 'keyboardWillSHow:'

Dieses Bild zeigen verschiedene Versuche, die alle gescheitert sind.

enter image description here

Was ist die neue Syntax für diesen Code?

Antwort

10

die Selector Weisen wie folgt:

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

Und die Methode zu aktualisieren, was Sie wollen:

func keyboardWillShow(notification: NSNotification) { 

    //Update UI or Do Something 

} 

gleiche Weise für UIKeyboardWillHideNotification tun können.

+1

Danke Sohil. Es klappt –

0

Die schnelle Syntax wurde geändert. Versuchen Sie folgendes:

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

Es kennzeichnet immer noch einen Fehler: Typ: 'SignInViewController' hat kein Mitglied 'KeyboardWillShow'. Sofern Sie Xcode nicht aktualisiert haben, funktioniert dieser Code. –

+0

Es kann diese Methode nicht finden. Stellen Sie sicher, dass keyboardWillShow in dieser Klasse verfügbar ist und die Namen übereinstimmen (mir ist die Fehlermeldung Keyboard in Großbuchstaben aufgefallen). Es ist unorthodox, einen Methodennamen mit einem Großbuchstaben zu beginnen. –

+0

keyBoardWillShow wurde nicht groß geschrieben: Entschuldigung für den Tippfehler. Still-Flags mit dem gleichen Fehler wie oben erwähnt. –

0

Ich habe dieselben Probleme hatten und auch herausfinden, dass die Klasse, die Sie auf verweisen auch von NSObject subclassed werden (was nicht NEFZ. Der Fall in Swift) Ansonsten erhalten Sie die Meldung

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

Swift 3 Syntax (wie Sohil des oben):

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

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

Swift 3 Beispiel:

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