J'essaie de transmettre un objet de mon délégué d'application à un récepteur de notification dans une autre classe.
Je veux passer un entier messageTotal
. En ce moment j'ai:
Dans le récepteur:
- (void) receiveTestNotification:(NSNotification *) notification
{
if ([[notification name] isEqualToString:@"TestNotification"])
NSLog (@"Successfully received the test notification!");
}
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissSheet) name:UIApplicationWillResignActiveNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveTestNotification:) name:@"eRXReceived" object:nil];
Dans la classe qui effectue la notification:
[UIApplication sharedApplication].applicationIconBadgeNumber = messageTotal;
[[NSNotificationCenter defaultCenter] postNotificationName:@"eRXReceived" object:self];
Mais je veux passer l'objet messageTotal
à l'autre classe.
Réponses:
Vous devrez utiliser la variante "userInfo" et passer un objet NSDictionary qui contient l'entier messageTotal:
Du côté récepteur, vous pouvez accéder au dictionnaire userInfo comme suit:
la source
messageTotal
un badge sur un UIButton, savez-vous comment je peux actualiser le bouton avec le nouveau nombre de badges? Le code pour afficher l'imageviewDidLoad
estUIBarButtonItem *eRXButton = [BarButtonBadge barButtonWithImage:buttonImage badgeString:@"1" atRight:NO toTarget:self action:@selector(eRXButtonPressed)];
En m'appuyant sur la solution fournie, j'ai pensé qu'il pourrait être utile de montrer un exemple en passant votre propre objet de données personnalisé (que j'ai référencé ici comme un `` message '' selon la question).
Classe A (expéditeur):
Classe B (récepteur):
la source
object
paramètre inpostNotificationName
devrait signifier celui qui envoie cette notification.userInfo
et la réponse acceptée ci-dessus a maintenant été modifiée pour le montrer.userInfo
dictionnaire comme moyen de transmettre les données de l'objet.Comme @Johan Karlsson l'a souligné ... je faisais mal. Voici la manière appropriée d'envoyer et de recevoir des informations avec NSNotificationCenter.
Tout d'abord, nous examinons l'initialiseur pour postNotificationName:
la source
Nous passerons nos informations en utilisant le
userInfo
paramètre. Le[NSObject : AnyObject]
type est un vestige d' Objective-C . Donc, dans Swift land, tout ce que nous avons à faire est de passer dans un dictionnaire Swift qui a des clés dérivéesNSObject
et des valeurs qui peuvent l'êtreAnyObject
.Avec cette connaissance, nous créons un dictionnaire que nous passerons dans le
object
paramètre:Ensuite, nous passons le dictionnaire dans notre paramètre objet.
Expéditeur
Classe de récepteur
Nous devons d'abord nous assurer que notre classe observe la notification
Ensuite, nous pouvons recevoir notre dictionnaire:
la source
Swift 5
Bonus (que vous devez absolument faire!):
Remplacez
Notification.Name("SomeNotificationName")
par.someNotificationName
:Remplacez
"key0"
et"key1"
parNotification.Key.key0
etNotification.Key.key1
:Pourquoi devrais-je vraiment faire ça? Pour éviter les erreurs de frappe coûteuses, profitez du changement de nom, profitez de la recherche d'utilisation, etc.
la source
'Key' is not a member type of 'Notification'
. Voir ici: https://ibb.co/hDQYbd2Key
struct a été supprimé depuis. Je mets à jour la réponseObjet / type personnalisé Swift 5.1
la source