6

In meinem iPad App aufgerufen wird, in einer Klasse-I-Register für eine Meldung:NSNotificationCenter Wähler nicht

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

Meine selectedList: Methode sieht wie folgt aus:

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

Dann in einer anderen Klasse (a UITableViewController) Ich poste diese Benachrichtigung, wenn eine Zeile ausgewählt ist:

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

Ich kann bestätigen, dass die Benachrichtigung gepostet wird, da die "Benachrichtigungsbenachrichtigung" in der Konsole protokolliert wird, aber "Benachrichtigung erhalten" nie aufgerufen wird, was bedeutet, dass die Benachrichtigung nicht empfangen wird und der Selektor nicht aufgerufen wurde. Ich kann nicht herausfinden, was das verursacht.

Dank

+1

Etwas dumm, aber was mich für eine Weile verwirrt. Ich hatte das gleiche Problem. In meinem Fall habe ich nicht bemerkt, dass eine Unterklasse eine Methode mit demselben Selektor wie der, den ich in der Elternklasse deklarieren wollte, hatte. –

+0

Hatte ich selbst, auch etwas blöd: Ich habe eine Benachrichtigung mit einem Kleinbuchstaben anstelle eines Großbuchstabens gepostet. Sie sind Groß-und Kleinschreibung! –

Antwort

14

Die wahrscheinlichste Ursache ist, dass Sie tatsächlich sind nicht addObserver:selector:name:object: aufrufen. Sie haben dort keine Protokollierungslinie; Bist du sicher, dass Code läuft?

Die zweithäufigste Ursache ist, dass Sie removeObserver: aufrufen, bevor die Benachrichtigung gesendet wird. Dies ist am häufigsten in dealloc (die sollte immer Anruf removeObserver, wenn Sie jemals etwas beobachtet haben). Der Fehler hier wäre, dass Ihr Beobachtungsobjekt vor der Benachrichtigung aufgehoben wurde.

+0

Sie hatten Recht, ich erstellte das Objekt, das der Beobachter in Interface Builder war, und es wurde von nichts beibehalten. Vielen Dank. – indragie

+0

Ich hatte das gleiche Problem. Ich habe den Beobachter in der 'init' Methode anstelle von' initWithStyle' hinzugefügt. – testing

+1

Wenn Sie IB verwenden, um Ihre Sachen zu machen, besteht die Möglichkeit, dass init nicht aufgerufen wird. Verwenden Sie initWithCoder oder awakeWithNib, je nachdem, was Sie tun möchten. – futureelite7