Domanda

Non riesco a ottenere il metodo di selezione, receiveChatText, nel NSNotificationCenter da eseguire e mi chiedo se il problema è perché il NSNotification postNotificationName è in AppDelegate.m ma NSNotificationCenter è in ViewController.m? OSSIA può il postNotificationName sapere che la NSNotificationCenter è in un altro file o viewController è che qualcosa che ho bisogno di dirlo?

In un viewController.m ho

 -(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");

}

e nel file AppDelegate.m livello superiore ho il seguente:

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

Tutte le idee che cosa potrebbe fermare receiveChatText venga eseguito quando didReceiveMessage si chiama?

È stato utile?

Soluzione

Non riesco a ottenere il metodo di selezione, receiveChatText, ...

In primo luogo, esso è receiveChatText:, con i due punti. Questo è importante in Objective-C e -receiveChatText: receiveChatText non si riferiscono allo stesso metodo.

In secondo luogo, “selettore” non significa che cosa pensate che significhi. Un selettore è il nome di un metodo. Si passa nel selettore per il messaggio che si desidera che il centro di notifica per inviare all'osservatore. Cioè, si indica il centro di notifica “quando la notifica arriva, inviare un messaggio receiveChatText: a me [il controller della vista]”.

... nel NSNotificationCenter ...

Il centro di notifica non ha un metodo di receiveChatText:. Il tuo osservatore (self) fa, motivo per cui questo è ciò che si desidera che il centro di notifica per inviare il messaggio.

... da eseguire e mi chiedo se il problema è perché il NSNotification postNotificationName è in AppDelegate.m ...

Una cosa simile è in AppDelegate.m.

I messaggi app delegato una notifica.

... ma NSNotificationCenter è in ViewController.m?

Una cosa simile è in ViewController.m.

Il controller di vista osserva per una notifica.

Fino a quando il controller della vista si aggiunge come osservatore prima che i messaggi app delegato della notifica, questa opera volontà. Se non funziona, uno o entrambi i passaggi non è accaduto o che è accaduto in ordine errato.

vale a dire. può il postNotificationName sapere che la NSNotificationCenter è in un altro file o viewController è che qualcosa che ho bisogno di dirlo?

Il centro di notifica non è in entrambi i file. [NSNotificationCenter defaultCenter] è un oggetto Singleton, condiviso in tutta l'intera applicazione, tra tutti gli oggetti che vogliono usarlo. È così che siete in grado di usarlo per avere il delegato app comunicano alla controller della vista e tutti gli oggetti che sono osservando per la notifica.

Stai inviando il centro di notifica di default un messaggio postNotificationName:object:userInfo:. Questo è lo stesso centro di notifica di default che si dovrebbe avere in precedenza inviato un messaggio addObserver:selector:name:object:. Finché si inizia osservando prima, quindi inviare la notifica alla stesso centro di notifica, il centro di notifica sarà in grado di inviare la notifica per l'osservatore (s) è stato aggiunto.

Tutte le idee che cosa potrebbe fermare receiveChatText

receiveChatText:

di essere eseguito quando didReceiveMessage si chiama?

  1. didReceiveMessage non inviare una notifica. Supponendo che il codice è mostrato nella tua domanda è precisa, non è questo il caso.
  2. Il controller vista non sta osservando per la notifica. Dal momento che inizia osservando sulla creazione, forse non è stato ancora creato. Oppure, potrebbe essere perché abbiate scavalcato init piuttosto che initWithNibName:bundle: di NS / UIViewController. Essere consapevoli di ciò inizializzatori designati diverse classi sono; la documentazione di solito dire.
  3. Il controller vista non sta osservando per la notifica ancora: È postato la notifica prima che il controller della vista ha iniziato osservando per esso (vale a dire, prima che si è creato il controller della vista)
  4. .

Si potrebbe anche voler far passare il testo chat come l'oggetto della notifica, o nel suo userInfo, piuttosto che costringere tutti gli osservatori dalla notifica di recuperarlo da una fonte non specificata.

Altri suggerimenti

+ defaultCenter è un metodo di classe su NSNotificationCenter che restituirà la stessa istanza NSNotificationCenter ogni volta che viene chiamato in un dato processo indipendentemente da dove si chiama da.

Come si 'ChatMessageReceived' definito? Dovrebbe essere un NSString, ma è il nome di 'ChatMessageReceived' un simbolo valida nel contesto di entrambe le classi?

che sembra che dovrebbe funzionare, a patto che il valore della ChatMessageReceived è lo stesso in entrambi i casi.

Hai usato il debugger per verificare che il metodo init nel file di vista del regolatore è chiamato prima La notifica viene pubblicato in didReceiveMessage?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top