38 votes

Comment passer un NSDictionary avec postNotificationName: object:

Je suis en train de passer un NSDictionary forme d'une UIView à un UIViewController à l'aide de NSNotificationCenter. Le dictionnaire fonctionne bien à la fois les, un avis est affiché, mais dans la méthode de réception de la je ne suis pas en mesure d'accéder à des objets dans le dictionnaire.

Voici comment je suis entrain de créer le dictionnaire et l'affichage de la notification...

itemDetails = [[NSDictionary alloc] initWithObjectsAndKeys:@"Topic 1", @"HelpTopic", nil];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"HotSpotTouched" object:itemDetails];

Dans le UIViewController je suis en train de l'observateur...

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(hotSpotMore:)
                                             name:@"HotSpotTouched"
                                           object:nil];

Pour des fins de test hotSpotMore ressemble à ceci...

- (void)hotSpotMore:(NSDictionary *)itemDetails{
      NSLog(@"%@", itemDetails);
      NSLog(@"%@", [itemDetails objectForKey:@"HelpTopic"]);    
}

La première NSLog fonctionne très bien et affiche le contenu du dictionnaire. Le deuxième journal jette l'exception suivante...

 [NSConcreteNotification objectForKey:]: unrecognized selector sent to instance 0x712b130

Je ne comprends pas pourquoi je ne peut pas accéder à tous les objets dans le passé dictionnaire.

Merci d'avance pour toute aide.

Jean

110voto

Matthias Bauch Points 52145

La première NSLog fonctionne très bien à l'affichage de le contenu du dictionnaire. L' deuxième journal des lancers suivants exception...

Le programme essaie de vous tromper, il semble juste comme il est de votre dictionnaire, parce que votre dictionnaire est à l'intérieur de la notification. De l'exception que vous pouvez voir que votre objet est en fait à partir d'une classe nommée NSConcreteNotification.
C'est parce que l'argument de notification-la méthode est toujours un NSNotification-objet. cela va fonctionner:

- (void)hotSpotMore:(NSNotification *)notification {
      NSLog(@"%@", notification.object);
      NSLog(@"%@", [notification.object objectForKey:@"HelpTopic"]);    
}

tout comme un indice: l'objet est généralement de l'objet qui envoie la notification, vous devez envoyer votre NSDictionary comme userInfo.
Je pense que cela permettrait d'améliorer votre code si vous voulez faire comme ceci:

NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center postNotificationName:@"HotSpotTouched" object:self userInfo:itemDetails];


- (void)hotSpotMore:(NSNotification *)notification {
      NSLog(@"%@", notification.userInfo);
      NSLog(@"%@", [notification.userInfo objectForKey:@"HelpTopic"]);    
}

Le paramètre d'objet est utilisé pour distinguer les différents objets qui peuvent envoyer une notification.
Disons que vous avez deux HotSpot objets qui peuvent à la fois d'envoyer la notification. Lorsque vous définissez l' object en addObserver:selector:name:object: vous pouvez ajouter un autre observateur pour chacun des objets. À l'aide de néant que le paramètre de l'objet signifie que toutes les notifications doivent être reçus, quel que soit l'objet qui a envoyé la notification.

E. g:

FancyHotSpot *hotSpotA;
FancyHotSpot *hotSpotB;

// notifications from hotSpotA should call hotSpotATouched:
[[NSNotificationCenter defaultCenter] addObserver:self 
       selector:@selector(hotSpotATouched:) name:@"HotSpotTouched" 
       object:hotSpotA]; // only notifications from hotSpotA will be received

// notifications from hotSpotB should call hotSpotBTouched:
[[NSNotificationCenter defaultCenter] addObserver:self 
       selector:@selector(hotSpotBTouched:) name:@"HotSpotTouched" 
       object:hotSpotB]; // only notifications from hotSpotB will be received

// notifications from all objects should call anyHotSpotTouched:
[[NSNotificationCenter defaultCenter] addObserver:self 
       selector:@selector(anyHotSpotTouched:) name:@"HotSpotTouched" 
       object:nil]; // nil == "any object", so all notifications with the name "HotSpotTouched" will be received


- (void)hotSpotATouched:(NSNotification *)n {
    // only gets notification of hot spot A
}

- (void)hotSpotBTouched:(NSNotification *)n {
    // only gets notification of hot spot B
}

- (void)anyHotSpotTouched:(NSNotification *)n {
    // catches all notifications
}

4voto

Amit Singh Points 1003

C’est le meilleur moyen de transmettre les données de votre dictionnaire avec NSNotification.

Post Notification:

  [[NSNotificationCenter defaultCenter] postNotificationName:@"Put Your Notification Name" object:self userInfo:"Pass your dictionary name"];
 

Ajouter un observateur pour gérer la notification.

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mydictionaryData:)  name:@"Put Your Notification Name" object:nil];
 

Méthode de gestion des notifications Put.

 - (void)mydictionaryData:(NSDictionary *)sourceDictionary{
      NSLog(@"%@", sourceDictionary);
    }
 

J'espère que cette solution vous aidera.

3voto

Brabbeldas Points 273

La méthode dont parle Matthias et celle que je pense que vous devriez utiliser est

 postNotificationName:object:userInfo:
 

Où objet est l'expéditeur et userInfo est votre dictionnaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X