2017-10-11 9 views
3

Je plante et obtient une erreur unrecognized selector chaque fois qu'un Notification arrive et l'application essaie d'exécuter sa méthode associée. Voilà mon code - qui est en viewDidLoad:Swift 4 - Centre de notifications addObserver problème

let notificationCenter = NotificationCenter.default 
notificationCenter.addObserver(self, selector: Selector(("sayHello")), name:NSNotification.Name(rawValue: "dataDownloadCompleted"), object: nil) 

La méthode sayHello() est assez simple - ressemble à ceci:

func sayHello() { 
    print("Hello") 
} 

J'ai vérifié que le Notification est affiché avec succès et qu'il ARRIVE avec succès - ce n'est pas le problème. L'erreur se produit lorsque l'application semble agir à l'arrivée du Notification - en exécutant la méthode sayHello(). Il continue à me donner cette erreur unrecognized selector.

Des idées que je fais mal? (En passant, cela a parfaitement fonctionné avec Swift 3 & Xcode 8, mais maintenant avec Swift 4 et Xcode 9 la syntaxe a changé [Xcode m'a guidé à travers les correctifs/mises à jour de code nécessaires] - mais les plantages continuent.)

+0

Si vous aviez utilisé '# selector', le compilateur aurait signalé le problème -' sayHello' doit être '@ objc'. Comparez https://stackoverflow.com/q/44390378/2976878 – Hamish

+0

Utilisez comme ceci '#selector (yourVC.yourfunctionName)' – Mannopson

+0

Comme déjà mentionné par @Hamish vous devriez utiliser '#selector (sayHello)' et votre signature de méthode vous devriez passer également l'objet de notification (supprimer le préfixe NS) '@objc func sayHello (_ notification: Notification)' –

Répondre

11

Vous pouvez améliorer votre code avec ces étapes:

extension Notification.Name { 
    static let dataDownloadCompleted = Notification.Name(
     rawValue: "dataDownloadCompleted") 
} 

Et l'utiliser comme ceci:

let notificationCenter = NotificationCenter.default 
notificationCenter.addObserver(self, 
           selector: #selector(YourClass.sayHello), 
           name: .dataDownloadCompleted, 
           object: nil) 

Mais comme on l'a déjà souligné, problème est résolu en changeant de #selector

+1

Vous devez supprimer le préfixe NS –

+0

oui, exactement, merci;) –

+0

Le nom n'est pas membre de la notification - le problème vient en swift 4 –