NSNotification postNotificationName à AppDelegate mais NSNotificationCenter dans ViewController?

StackOverflow https://stackoverflow.com/questions/4577255

Question

Je ne peux pas obtenir la méthode de sélection, receiveChatText, dans le NSNotificationCenter pour exécuter et je me demande si le problème est parce que le NSNotification postNotificationName est AppDelegate.m mais NSNotificationCenter est en ViewController.m? C'EST À DIRE. peut le postNotificationName savoir que le NSNotificationCenter est dans un autre fichier viewController ou est-ce quelque chose que je dois le dire?

Dans un viewController.m j'ai

 -(id)init
 {
self = [super init];
if(self){
    [[NSNotificationCenter defaultCenter] addObserver:self  
                                      selector:@selector(receiveChatText:) 
                                                      name:ChatMessageReceived  
                                               object:nil];
 return self;
}

- (void)receiveChatText:(NSNotification *)note {
NSLog(@"received chat text");

}

et dans le fichier AppDelegate.m de premier niveau, je donne les résultats suivants:

 -(void) didReceiveMessage {
    [[NSNotificationCenter defaultCenter] postNotificationName:ChatMessageReceived 
                                          object:nil
                                          userInfo:nil];        
 }

Toutes les idées ce qui pourrait arrêter receiveChatText d'être exécuté quand didReceiveMessage est appelé?

Était-ce utile?

La solution

  

Je ne peux pas obtenir la méthode de sélection, receiveChatText, ...

Tout d'abord, il est receiveChatText:, avec le côlon. Ceci est important dans -receiveChatText: et receiveChatText Objective-C ne se réfèrent pas à la même méthode.

En second lieu, « sélecteur » ne veut pas dire ce que vous pensez que cela signifie. Un sélecteur est le nom d'une méthode. Vous passez dans le sélecteur pour le message que vous voulez que le centre de notification pour envoyer à l'observateur. Autrement dit, vous dites au centre de notification « lorsque cette notification arrive, envoyer un message receiveChatText: me [le contrôleur de vue] ».

  

... dans le NSNotificationCenter ...

Le centre de notification ne dispose pas d'une méthode de receiveChatText:. Votre observateur (self) fait, ce qui est pourquoi c'est ce que vous voulez que le centre de notification pour envoyer le message.

  

... à exécuter et je me demande si le problème est parce que le NSNotification postNotificationName est AppDelegate.m ...

Une telle chose est en AppDelegate.m.

Les postes de délégués de l'application d'une notification.

  

... mais NSNotificationCenter est ViewController.m?

Une telle chose est en ViewController.m.

Le contrôleur de vue observe une notification.

Tant que le contrôleur de vue s'ajoute à titre d'observateur avant les postes de délégué de l'application de la notification, cela fonctionne. Si cela ne fonctionne pas, soit une ou deux étapes n'a pas eu lieu ou ils se sont produits dans le mauvais ordre.

  

i.e.. peut le postNotificationName savoir que le NSNotificationCenter est dans un autre fichier viewController ou est-ce quelque chose que je dois le dire?

Le centre de notification est soit dans le fichier. [NSNotificationCenter defaultCenter] est un objet singleton, partagé à travers toute votre application parmi tous les objets qui veulent l'utiliser. Voilà comment vous êtes en mesure de l'utiliser pour avoir le délégué de l'application communiquer au contrôleur de vue et tout autre objet qui observent pour la notification.

Vous envoyez le centre de notification par défaut un message postNotificationName:object:userInfo:. Ceci est le même centre de notification par défaut que vous avez déjà envoyé un message addObserver:selector:name:object:. Tant que vous commencez à observer d'abord, puis envoyer la notification au même centre de notification, le centre de notification sera en mesure d'envoyer la notification à l'observateur (s) que vous avez ajouté.

  

Toutes les idées ce qui pourrait arrêter receiveChatText

receiveChatText:

  

d'être exécutée lorsque didReceiveMessage est appelé?

  1. didReceiveMessage n'a pas affiché une notification. En supposant que le code que vous montriez votre question est exacte, ce n'est pas le cas.
  2. Le contrôleur de vue ne respecte pas la notification. Comme il commence à observer la création, peut-être il n'a pas encore été créé. Ou, il peut être parce que vous avez remplacée plutôt que le init initWithNibName:bundle: de NS / UIViewController. Soyez conscient de ce que différents les initialiseurs désignés de classes sont; la documentation dira habituellement.
  3. Le contrôleur de vue ne respecte pas encore la notification: Vous mis la notification avant que le contrôleur de vue a commencé à observer pour elle (à savoir, avant la création du contrôleur de vue)
  4. .

Vous pouvez également passer le texte de chat comme l'objet de la notification, ou dans son userInfo, plutôt que de forcer tous les observateurs de la notification pour le récupérer à partir d'une source non spécifiée.

Autres conseils

+ defaultCenter est une méthode de classe sur NSNotificationCenter qui retournera la même instance NSNotificationCenter chaque fois qu'il est appelé dans un processus donné, peu importe l'endroit où vous l'appelez de.

Comment est 'ChatMessageReceived' défini? Il devrait être un NSString mais est le nom « ChatMessageReceived » un symbole valide dans le contexte des deux de vos classes?

Cela ressemble à cela devrait fonctionner, aussi longtemps que la valeur de ChatMessageReceived est le même dans les deux cas.

Avez-vous utilisé le débogueur pour vérifier que la méthode init dans le fichier du contrôleur de vue est appelé avant la notification est affiché dans didReceiveMessage?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top