2010-11-30 13 views
69

Podría alguien mostrarme cómo usar la propiedad del objeto en NSNotifcationCenter. Quiero poder usarlo para pasar un valor entero a mi método selector.cómo usar la propiedad del objeto NSNotificationcenter

Así es como configuré el detector de notificaciones en mi interfaz de usuario. Al ver que quiero que se pase un valor entero, no estoy seguro de con qué reemplazarlo.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveEvent:) name:@"myevent" object:nil]; 


- (void)receiveEvent:(NSNotification *)notification { 
    // handle event 
    NSLog(@"got event %@", notification); 
} 

Envío la notificación de otra clase como esta. La función se pasa una variable llamada índice. Es este valor el que quiero de alguna manera disparar con la notificación.

-(void) disptachFunction:(int) index 
{ 
    int pass= (int)index; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"myevent" object:pass]; 
    //[[NSNotificationCenter defaultCenter] postNotificationName:<#(NSString *)aName#> object:<#(id)anObject#> 
} 

Respuesta

102

El parámetro object representa el remitente de la notificación, que es por lo general self.

Si desea pasar información adicional, debe utilizar el método NSNotificationCenterpostNotificationName:object:userInfo:, que toma un diccionario arbitrario de valores (que puede definir libremente). El contenido debe ser instancias reales NSObject, no un tipo integral como un entero, por lo que debe ajustar los valores enteros con los objetos NSNumber.

NSDictionary* dict = [NSDictionary dictionaryWithObject: 
         [NSNumber numberWithInt:index] 
         forKey:@"index"]; 

[[NSNotificationCenter defaultCenter] postNotificationName:@"myevent" 
             object:self 
             userInfo:dict]; 
+2

Grandes mentes trabajando simultáneamente. :) –

+0

Fui con su opción. Lo único adicional que tuve que hacer fue envolver un grupo de autorrelease alrededor del diccionario. – dubbeat

+3

(¡Ah, y mi solución es la misma que la de Matthew, me las arreglé para hacer clic en Enviar un poco más rápido!) – gavinb

81

La propiedad object no es apropiada para eso. En vez que desee utilizar el parámetro userinfo:

+ (id)notificationWithName:(NSString *)aName 
        object:(id)anObject 
        userInfo:(NSDictionary *)userInfo 

userInfo es, como se puede ver, una NSDictionary específicamente para el envío de información junto con la notificación.

Su método dispatchFunction el contrario, sería algo como esto:

- (void) disptachFunction:(int) index { 
    NSDictionary *userInfo = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:index] forKey:@"pass"]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"myevent" object:nil userInfo:userInfo]; 
} 

Su método receiveEvent sería algo como esto:

- (void)receiveEvent:(NSNotification *)notification { 
    int pass = [[[notification userInfo] valueForKey:@"pass"] intValue]; 
} 
+0

"La propiedad del objeto no es apropiada para eso." ¿Por qué no es apropiado? De todos modos si trato de usar la propiedad del objeto para pasar (por ejemplo) un NSString *. ¿Lo que sucederá? – Selvin

+1

@Selvin Es para enviar el objeto que publica la notificación (lo establecería en 'self' si quisiera usarlo). ¿Qué pasará si pones algo más allí? No tengo ni idea, pero si tuviera que adivinar, podría estropear las cosas que están pasando debajo de la tapa, como el Centro de Notificación que rastrea lo que debe ser lanzado. ¿Por qué arriesgarse cuando hay un sistema real para pasar objetos? –

+3

"Un objeto NSNotification (referido como notificación) contiene un nombre, un objeto y un diccionario opcional. El nombre es una etiqueta que identifica la notificación. El objeto es cualquier objeto que el póster de la notificación quiera enviar a los observadores de esa notificación, típicamente el objeto que publicó la notificación en sí. El diccionario puede contener información adicional sobre el evento ". Me parece que sería perfectamente correcto poner algo que no sea 'self' y' nil' en 'object:'. – max

Cuestiones relacionadas