Comment ajouter un observateur dans Swift au centre de notification par défaut? J'essaie de porter cette ligne de code qui envoie une notification lorsque le niveau de la batterie change.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(batteryLevelChanged:) name:UIDeviceBatteryLevelDidChangeNotification object:nil];
ios
swift
nsnotificationcenter
Bleu baie
la source
la source
Réponses:
C'est la même chose que l'API Objective-C, mais utilise la syntaxe de Swift.
Swift 4.2 et Swift 5:
Si votre observateur n'hérite pas d'un objet Objective-C, vous devez préfixer votre méthode
@objc
afin de l'utiliser comme sélecteur.Voir Référence de classe NSNotificationCenter , Interaction avec les API Objective-C
la source
UIDeviceBatteryLevelDidChangeNotification
pas entre guillemets? C'est un type de chaîne.@objc
.Swift 4.0 et Xcode 9.0+:
Envoyer une notification (post):
OU
Recevoir (obtenir) une notification:
Gestionnaire de méthode de fonction pour la notification reçue:
Swift 3.0 et Xcode 8.0+:
Envoyer une notification (post):
Recevoir (obtenir) une notification:
Gestionnaire de méthode pour la notification reçue:
Supprimer la notification:
Swift 2.3 et Xcode 7:
Envoyer une notification (post)
Recevoir (obtenir) une notification
Gestionnaire de méthode pour la notification reçue
Pour les versions Xcode historiques ...
Envoyer une notification (post)
Recevoir (obtenir) une notification
Supprimer la notification
Gestionnaire de méthode pour la notification reçue
Annotez la classe ou la méthode cible avec @objc
la source
@objc
.methodOFReceivedNotication
doit être annoté avecdynamic
ou être membre d'une sous-classe de NSObject.object 0x7fd68852d710 of class 'TestNotifications.MyObject' does not implement methodSignatureForSelector: -- trouble ahead
,Unrecognized selector -[TestNotifications.MyObject methodOFReceivedNotication:]
Une bonne façon de le faire est d'utiliser la
addObserver(forName:object:queue:using:)
méthode plutôt que laaddObserver(_:selector:name:object:)
méthode qui est souvent utilisée à partir du code Objective-C. L'avantage de la première variante est que vous n'avez pas à utiliser l'@objc
attribut sur votre méthode:et vous pouvez même simplement utiliser une fermeture au lieu d'une méthode si vous le souhaitez:
Vous pouvez utiliser la valeur renvoyée pour arrêter d'écouter la notification ultérieurement:
Il y avait un autre avantage à utiliser cette méthode, à savoir qu'elle ne vous oblige pas à utiliser des chaînes de sélection qui ne pouvaient pas être vérifiées statiquement par le compilateur et étaient donc fragiles à casser si la méthode était renommée, mais Swift 2.2 et inclure plus tard des
#selector
expressions qui résolvent ce problème.la source
addObserver(_:selector:name:object:)
façon de se désinscrire. Vous devez garder l'objet retournéaddObserverForName(_:object:queue:usingBlock:)
et le passer àremoveObserver:
addObserverForName(_:object:queue:usingBlock:)
.UIViewController
etself
faites référence à cette fermeture, vous devez utiliser[weak self]
ou vous aurez un cycle de référence et la fuite de mémoire.Swift 3.0 dans Xcode 8
Swift 3.0 a remplacé de nombreuses API "typées en chaîne" par des
struct
"types d'encapsuleur", comme c'est le cas avec NotificationCenter. Les notifications sont désormais identifiées par unstruct Notfication.Name
plutôt que parString
. Consultez le guide Migration vers Swift 3 .Utilisation précédente :
Nouvelle utilisation de Swift 3.0:
Tous les types de notification système sont désormais définis comme des constantes statiques sur
Notification.Name
; à savoir.UIDeviceBatteryLevelDidChange
,.UIApplicationDidFinishLaunching
,.UITextFieldTextDidChange
, etc.Vous pouvez étendre
Notification.Name
vos propres notifications personnalisées afin de rester cohérent avec les notifications système:la source
Déclarez un nom de notification
Vous pouvez ajouter un observateur de deux manières:
En utilisant
Selector
ou en utilisant
block
Postez votre notification
Pour une
block
implémentation basée, vous devez faire une danse faible-forte si vous voulez utiliserself
à l'intérieur du bloc. Plus d'informationsLes observateurs basés sur des blocs doivent être supprimés plus d'informations
la source
Passer des données à l'aide de NSNotificationCenter
Vous pouvez également transmettre des données à l'aide de NotificationCentre dans swift 3.0 et NSNotificationCenter dans swift 2.0.
Version Swift 2.0
Passer des informations en utilisant userInfo qui est un dictionnaire facultatif de type [NSObject: AnyObject]?
Version Swift 3.0
L'utilisateur info prend maintenant [AnyHashable: Any]? comme argument, que nous fournissons comme un littéral de dictionnaire dans Swift
Données de passe source à l'aide de NotificationCentre (swift 3.0) et NSNotificationCenter (swift 2.0)
la source
Dans Swift 5
ViewControllerA (récepteur)
ViewControllerB (expéditeur)
la source
Je peux faire l'une des choses suivantes pour utiliser avec succès un sélecteur - sans rien annoter avec @objc:
OU
Ma version xcrun montre Swift 1.2, et cela fonctionne sur Xcode 6.4 et Xcode 7 beta 2 (que je pensais utiliser Swift 2.0):
la source
@objc
si votre classe d'observateur hérite deNSObject
.String
versSelector
. :)@objc
annotation de la méthode dans maNSObject
classe non- observateur, ajouté leas Selector
casting auString
nom du sélecteur et lorsque la notification se déclenche, l'application se bloque. Ma version Swift est exactement la même que la vôtre.@objc
annotation fonctionne pour vous, et pas de cette façon, alors continuez à annoter!Dans swift 2.2 - XCode 7.3, nous utilisons
#selector
pourNSNotificationCenter
la source
Nous devons également supprimer la notification.
Ex.
la source
Dans swift 3, Xcode 8.2: - vérification du niveau d'état de la batterie
la source
NSNotificationCenter ajoute une syntaxe d'observateur dans Swift 4.0 pour iOS 11
Il s'agit du type de nom de notification keyboardWillShow. Un autre type peut être sélectionné parmi les options disponibles
le sélecteur est de type @objc func qui gère la façon dont le clavier s'affichera (c'est votre fonction utilisateur)
la source
#selector
doit être annotée@objc
. Par exemple:@objc func keyboardShow() { ... }
Cela m'a jeté une minute dans Swift 4!Swift 5 et Xcode 10.2:
la source
Observateur de notification Swift 5
la source