6

Nel mio iPad, in una classe mi iscrivo ad una notifica:selettore NSNotificationCenter non essere chiamato

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

Il mio metodo selectedList: assomiglia a questo:

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

Poi, in un'altra classe (un UITableViewController) Inserisco la notifica quando viene selezionata una riga:

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

Posso confermare che la notifica è stata inviata, perché "notifica di pubblicazione" è registrata nella console, ma "notifica ricevuta" non viene mai chiamata, il che significa che la notifica non viene ricevuta e il selettore non è stato chiamato. Non riesco a capire cosa sta causando questo.

Grazie

+1

Qualcosa di stupido, ma che mi ha lasciato perplesso per un po '. Ho avuto lo stesso problema. Nel mio caso, non ho notato che una sottoclasse aveva un metodo con lo stesso selettore di quello che stavo cercando di dichiarare nella classe genitore. –

+0

Lo avevo anche io, anche qualcosa di stupido: stavo inviando una notifica con una lettera minuscola invece di una lettera maiuscola. Sono case sensitive! –

risposta

14

La causa più probabile è che non si è in realtà chiamando addObserver:selector:name:object:. Non hai una linea di registrazione lì; sei sicuro che il codice sia in esecuzione?

La seconda causa più probabile è che chiami removeObserver: prima che la notifica venga pubblicata. Questo è più comunemente in dealloc (che dovrebbe sempre chiamare removeObserver se avete mai osservato qualcosa). L'errore qui sarebbe che il tuo oggetto di osservazione è stato deallocato prima della notifica.

+0

Avevi ragione, stavo creando l'oggetto che era l'osservatore in Interface Builder e non veniva mantenuto da niente. Grazie. – indragie

+0

Ho avuto lo stesso problema. Ho aggiunto l'osservatore nel metodo 'init' invece di' initWithStyle' – testing

+1

Se si usa IB per creare i propri file, è probabile che init non venga richiamato. Usa initWithCoder o awakeWithNib a seconda di cosa vuoi fare. – futureelite7