2016-04-01 22 views
5

Dopo il recente aggiornamento di Xcode, questo codice utilizzato per funzionare non funziona più. La maggior parte del selettore (":") ha una correzione automatica con l'eccezione per questo codice:Nessun metodo dichiarato con Objective-C Selector per la notifica UIKeyboardWillShowNotification e 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); 
} 

che le bandiere di un errore:

No method declared with Objective C selector 'keyboardWillSHow:'

questa immagine Esposizione diversi tentativi che sono tutti falliti.

enter image description here

Qual è la nuova sintassi per questo codice?

risposta

10

assegnare il Selector come di seguito:

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

E il metodo per aggiornare ciò che si vuole:

func keyboardWillShow(notification: NSNotification) { 

    //Update UI or Do Something 

} 

stesso modo si può fare per UIKeyboardWillHideNotification.

+1

Grazie Sohil. Funziona –

0

La sintassi rapida è cambiata. Prova questo:

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

Segnala ancora un errore: Tipo: 'SignInViewController' non ha alcun membro 'KeyboardWillShow'. A meno che tu non abbia aggiornato Xcode, questo codice funzionerà. –

+0

Non riesce a trovare questo metodo. Assicurati che keyboardWillShow sia disponibile in quella classe e che i nomi corrispondano (ho notato il messaggio di errore in maiuscolo Tastiera). Non è ortodosso iniziare il nome di un metodo con una lettera maiuscola. –

+0

keyBoardWillShow non è stato in maiuscolo: mi dispiace per l'errore di battitura. Bandiere ancora con lo stesso errore di cui sopra. –

0

ho avuto stessi problemi e anche scoprire che la classe si fa riferimento a deve essere una sottoclasse di NSObject (che non è NECC. Il caso Swift) altrimenti si ottiene il messaggio

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

Swift 3 sintassi (proprio come Sohil di sopra):

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

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

Swift 3 esempio:

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