6

Dans mon application iPad, dans une classe I inscrire une notification:sélecteur NSNotificationCenter pas appelé

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
    [nc addObserver:self selector:@selector(selectedList:) name:@"TTSelectedList" object:nil]; 

Ma méthode selectedList: ressemble à ceci:

- (void)selectedList:(NSNotification*)notification 
{ 
    NSLog(@"received notification"); 
} 

Puis dans une autre classe (un UITableViewController) Je poste cette notification lorsqu'une ligne est sélectionnée:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSLog(@"posting notification"); 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"TTSelectedList" object:nil]; 
} 

Je peux confirmer que la notification est en cours de publication, car "notification de publication" est enregistrée sur la console, mais "notification reçue" n'est jamais appelée, ce qui signifie que la notification n'est pas reçue et le sélecteur n'a pas été appelé. Je ne peux pas comprendre ce qui cause cela.

Merci

+1

Quelque chose de stupide, mais qui m'a laissé perplexe pendant un moment. J'ai eu le même problème. Dans mon cas, je n'ai pas remarqué qu'une sous-classe avait une méthode avec le même sélecteur que celui que j'essayais de déclarer dans la classe parente. –

+0

Avait moi-même, aussi quelque chose de stupide: Je publiais une notification avec une lettre minuscule au lieu d'une lettre majuscule. Ils sont sensibles à la casse! –

Répondre

14

La cause la plus probable est que vous n'êtes pas vraiment appeler addObserver:selector:name:object:. Vous n'avez pas de ligne de journalisation là-bas; Êtes-vous sûr que le code est en cours d'exécution?

La deuxième cause la plus probable est que vous appelez removeObserver: avant la publication de la notification. C'est le plus souvent dans dealloc (qui devrait toujours appel removeObserver si vous avez déjà observé quoi que ce soit). L'erreur ici serait que votre objet observant a été désalloué avant la notification.

+0

Vous aviez raison, je créais l'objet qui était l'observateur dans Interface Builder, et il n'était pas retenu par quoi que ce soit. Merci. – indragie

+0

J'ai eu le même problème. J'ai ajouté l'observateur dans la méthode 'init' au lieu de' initWithStyle' – testing

+1

Si vous utilisez IB pour créer votre matériel, il y a de fortes chances que init ne soit pas appelé. Utilisez initWithCoder ou awakeWithNib en fonction de ce que vous voulez faire. – futureelite7