2013-08-23 14 views
5

Aggiungo un controller di visualizzazione come osservatore per la notifica UIKeyboardWillShowNotification.L'osservatore non viene mai rimosso da NSNotificationCenter

Ho questo codice nel mio viewDidLoad:

[[NSNotificationCenter defaultCenter] addObserver:self 
            selector:@selector(keyboardWillShow:) 
             name:UIKeyboardWillShowNotification 
             object:nil]; 

E nella mia dealloc:

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

L'osservatore non viene rimosso anche se dealloc viene chiamato quando il controller della vista è chiusa. Quindi, quando lo apro per la seconda volta, NSNotificationCenter proverà a notificare il vecchio oggetto, che viene rilasciato, e l'app si arresta in modo anomalo.

Ho visto diverse domande qui su StackOverflow riguardo a questo particolare problema, ma nessuna delle risposte funziona per me.

Ho provato a rimuovere l'osservatore in viewWillDisappear e viewDidDisappear ma si verifica lo stesso problema.

Sto usando ARC.

+0

non usare "dealloc" con ARC –

+4

@Vaibhav sbagliato. È perfettamente una buona pratica usare 'dealloc', non si può chiamare' [super dealloc] 'nell'implementazione –

+0

mi trovo ad affrontare lo stesso problema che hai, ma non sono in grado di trovare la soluzione adeguata quindi, ho risolto questo problema problema di 'BOOL isFirstTime;', imposta SÌ quando 'keyboardWillShow' e - (void) keyboardDidHide { if (!isFirstTime) ritorno; , , , , , , isTxtFieldKeyBoard = NO; isFirstTime = NO; } – iPatel

risposta

1

Hai provato questo pezzo esatto di codice in viewWillDisappear?

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

Dalla tua spiegazione non penso che il problema sia con la rimozione dell'osservatore. Prova ad attivare l'Observer da un altro viewcontroller. Se non viene attivato, saprai che la rimozione ha esito positivo e il problema si verifica quando aggiungi l'osservatore per la seconda volta.

+0

Sì, come ho menzionato nella mia domanda, l'ho provato. L'ho fatto senza la chiamata a super però, ma questo non fa differenza dato che l'implementazione di default non fa nulla. Ho provato ciò che hai suggerito qui aprendo il controller di visualizzazione una volta, chiudendolo, quindi aprendo un altro controller di visualizzazione che ha un 'UITextField'. Non appena appare la tastiera, l'app si blocca con il messaggio '*** - [NewTrackerViewController rispondeToSelector:]: messaggio inviato all'istanza deallocated 0xc14ac40'. 'NewTrackerViewController' è uno che non annulla mai la registrazione come osservatore. –

0

magari provare specificando il parametro name che avete impostato prima in questo modo:

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; 
0

Sembra che l'osservatore è sempre impostato più volte. Il tuo controller è ereditato da una classe che registra anche per la stessa notifica? Ciò potrebbe portare all'istanza del controllore registrarsi come osservatore più di una volta. Per aggirare il problema provare questo, nella classe di controllo in cui si aggiunge l'osservatore,

// Remove as observer first 
[[NSNotificationCenter defaultCenter] removeObserver:self]; 
             name:UIKeyboardWillShowNotification 
             object:nil]; 
// Then add 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(keyboardWillShow:) 
             name:UIKeyboardWillShowNotification 
             object:nil]; 

Questo farà sì che l'osservatore è sempre aggiunto solo una volta.

Spero che questo aiuti!

0
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"name" object:nil]; 

funziona bene con me

Problemi correlati