2009-10-20 8 views
6

Estoy intentando activar una Notificación en un método llamado setPosition en una clase, que desencadena setViewPointCenter en otra clase. Sin embargo, estoy tratando de enviar un CGPoint junto con él. Pero a Xcode no le está gustando ni un poco.Cocoa: Problema al pasar un CGPoint con NSNotification y NSDictionary

-(void)setPosition:(CGPoint)point 
{ 

    NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:@"sp", point, nil]; 

    [[NSNotificationCenter defaultCenter] 
    postNotificationName:@"SpriteDidSetPosition" 
    object:self 
    userInfo:dict]; 

    [super setPosition:point]; 
} 

desencadena este método en otra clase, pero arroja el error indicado

-(id) init{ 

    // Usual stuff, blah blah blah... 

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

} 

-(void) setViewPointCenter:(NSNotification *)notification 
{ 

    // ERROR: Invalid Initializer 
    CGPoint point = [[notification userInfo] valueForKey:@"sp"]; 


    // more code here.... 


} 

que he estado cavando alrededor, y encontró esta solución, pero aún así obtener un error.

-(void)setPosition:(CGPoint)point 
{ 
    // ERROR: Incompatile type for argument 1 of "Value With Point" 
    NSValue *pointAsObject = [NSValue valueWithPoint:point]; 
    NSDictionary *dict = [[NSDictionary alloc] 
         initWithObjectsAndKeys:@"sp", 
         pointAsObject, 
         nil]; 

    [[NSNotificationCenter defaultCenter] 
    postNotificationName:@"SpriteDidSetPosition" 
    object:self 
    userInfo:dict]; 

    [super setPosition:point]; 
} 

Me está volviendo loco. Y para confundirme aún más, cambiando CGPoint a NSPoint como esto

-(void)setPosition:(NSPoint)point 
{ 

    NSValue *pointAsObject = [NSValue valueWithPoint:point]; 
    NSDictionary *dict = [[NSDictionary alloc] init]; 
    [dict initWithObjectsAndKeys:@"sp", pointAsObject, nil]; 

    [[NSNotificationCenter defaultCenter] 
    postNotificationName:@"SpriteDidSetPosition" 
    object:self 
    userInfo:dict]; 

    [super setPosition:CGPointMake(point.x, point.y)]; 
} 

Get de librarse del error en setPosition, pero todavía estoy atornillado en setViewPointCenter. Y según tengo entendido, CGPoint y NSPoint deberían ser iguales, pero no se ven como lo hacen.

¿Alguien tiene un ejemplo práctico de cómo pasar un CGPoint en un diccionario? No puedo resolverlo.

Esto es para el iPhone, en caso de que eso marque la diferencia.

Respuesta

13

Intente utilizar +[NSValue valueWithCGPoint].

+1

Desearía haberlo encontrado antes, pero me encontré con esto, que lo explica con más profundidad. http://stackoverflow.com/questions/1032726/nsnotification-userinfo-example – gargantuan

1

Puede encapsular los valores xey desde CGPoint en objetos NSNumber utilizando +numberWithFloat: y luego agregar los dos objetos NSNumber resultantes en el diccionario. A continuación, puede reconstruir la CGPoint en el otro lado usando:

CGPoint myPoint; 
myPoint.x = [myNumberObject floatValue]; 
myPoint.y = [myNumberObject2 floatValue]; 

La razón de que no funcionaba en el primer intento fue que CGPoint no es un objeto, es una estructura C.

0

no he leído en GC y NSPoints, pero ¿qué tipos de datos puedo NSDictionary mantener? Verifique los documentos, tal vez debería enviarlo al NSData.

6

Usaría el NSStringFromCGPoint() function para convertirlo en una cadena, y luego usaría el CGPointFromString() function para convertirlo nuevamente.

+0

Los enlaces están rotos para mí. Nuevo enlace donde ambas funciones se encuentran ahora: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIKitFunctionReference/Reference/reference.html – cprcrack

0

Ha pasado mucho tiempo después de que @Ben Gottlieb haya dado una respuesta, , su respuesta es, pero para el futuro me estoy quedando con un ejemplo de referencia.

// In example, I want to send CGPoint with notification 
[[NSNotificationCenter defaultCenter] postNotificationName:@"MyNotification" object:@{@"someKeyToHoldCGPoint":[NSValue valueWithCGPoint:CGPointMake(10, 10)]}]; 

- (void) getPoints:(NSNotification *)notification { 

    //get the dictionary object from notification 
    NSDictionary *p = (NSDictionary *)notification.object; 

    //get the NSValue object from dictionary p 
    NSValue *value = [p valueForKey:@"someKeyToHoldCGPoint"]; 

    //convert the value to CGPoint 
    CGPoint points = [value CGPointValue]; 

    //check if we've the correct value 
    NSLog(@"%@",NSStringFromCGPoint(points)); 
} 

Debe iniciar sesión, (10,10).