NSNotification postNotificationName en AppDelegate pero NSNotificationCenter en ViewController?

StackOverflow https://stackoverflow.com/questions/4577255

Pregunta

No puedo conseguir el método de selección, receiveChatText, en el NSNotificationCenter para ejecutar y estoy preguntando si el problema se debe a que la NSNotification postNotificationName está en AppDelegate.m pero NSNotificationCenter está en ViewController.m? ES DECIR. puede el postNotificationName sabe que el NSNotificationCenter está en otro archivo o viewController es que algo que tengo que contarlo?

En un viewController.m TENGO

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

}

y en el archivo AppDelegate.m nivel superior Tengo el siguiente:

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

¿Alguna idea de lo que podría detener receiveChatText de ser ejecutado cuando se llama didReceiveMessage?

¿Fue útil?

Solución

No puedo conseguir el método de selección, receiveChatText, ...

En primer lugar, de receiveChatText:, con el colon. Esto es importante en -receiveChatText: Objective-C y receiveChatText no se refieren al mismo método.

En segundo lugar, “selector” no significa lo que usted piensa que significa. Un selector es el nombre de un método. Se pasa en el selector para el mensaje que desea que el centro de notificaciones a enviar a un observador. Es decir, le está diciendo al centro de notificación “cuando llega esta notificación, enviar un mensaje receiveChatText: a mí [el controlador de vista]”.

... en el NSNotificationCenter ...

El centro de notificación no tiene un método receiveChatText:. Su observador (self) lo hace, es por eso que es lo que desea que el centro de notificación para enviar el mensaje.

... a ejecutar y me pregunto si el problema se debe a que la NSNotification postNotificationName está en AppDelegate.m ...

No hay tal cosa está en AppDelegate.m.

Los mensajes aplicación de delegado una notificación.

... pero NSNotificationCenter está en ViewController.m?

No hay tal cosa está en ViewController.m.

El controlador de vista observa para una notificación.

Mientras el controlador de vista añade a sí mismo como un observador antes de que los puestos de aplicación de los delegados de la notificación, este trabajo. Si esto no funciona, ya sea uno o ambos pasos no sucedieron o que sucedieron en el orden equivocado.

I.E. puede el postNotificationName sabe que el NSNotificationCenter está en otro archivo o viewController es que algo que tengo que contarlo?

El centro de notificación no es en ningún fichero. [NSNotificationCenter defaultCenter] es un objeto único, común a lo largo de toda su aplicación entre los objetos que desean utilizarlo. Así es como usted es capaz de utilizarlo para tener el delegado de la aplicación comunicarse con el controlador de vista y cualquier otro objeto que se observa para la notificación.

Está enviando el centro de notificación por defecto un mensaje postNotificationName:object:userInfo:. Este es el mismo centro de notificación por defecto que debería haber enviado previamente un mensaje de addObserver:selector:name:object:. Mientras se inicia observando en primer lugar, a continuación, enviar la notificación al mismo centro de notificación, el centro de notificación será capaz de enviar la notificación al observador (s) que ha añadido.

¿Alguna idea de lo que podría detener receiveChatText

receiveChatText:

de ser ejecutado cuando se llama didReceiveMessage?

  1. didReceiveMessage no le envió una notificación. Suponiendo que el código que mostró en su pregunta es exacta, esto no es el caso.
  2. El controlador de vista no está observando para la notificación. Desde que empieza a observar en la creación, tal vez no se ha creado todavía. O bien, puede ser porque usted ha redefinido init en lugar de initWithNibName:bundle: de NS / UIViewController. Sea consciente de lo inicializadores designados diferentes clases son; la documentación suele decir.
  3. El controlador de vista no se observa para la notificación aún: Usted envió la notificación antes de que el controlador de vista comenzó observando para ello (es decir, antes de crear el controlador de vista)
  4. .

También puede ser que desee pasar el texto del chat como el objeto de la notificación, o en su userInfo, en lugar de obligar a todos los observadores de la notificación para recuperarlo desde una fuente no especificada.

Otros consejos

+ defaultCenter es un método de clase en NSNotificationCenter que devolverá la misma instancia NSNotificationCenter cada vez que se le llama en un proceso dado, independientemente de dónde se llame a.

¿Cómo se define 'ChatMessageReceived'? Debe ser una NSString pero es el nombre de 'ChatMessageReceived' un símbolo válido en el contexto tanto de sus clases?

Eso parece que debería funcionar, siempre y cuando el valor de ChatMessageReceived es la misma en ambos casos.

¿Ha utilizado el depurador para verificar que el método init en el archivo de controlador de vista se llama antes la notificación se puede encontrar en didReceiveMessage?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top