Cocoa:使用NSNotification和NSDictionary传递CGPoint的问题

时间:2009-10-20 20:37:13

标签: iphone cocoa cocos2d-iphone

我正在尝试在一个名为setPosition的方法中触发一个Notification,它在另一个类中触发setViewPointCenter。但是,我正在尝试发送一个CGPoint。但是Xcode并不喜欢它。

-(void)setPosition:(CGPoint)point
{   

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

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

    [super setPosition:point];
}

在另一个类中触发此方法,但会抛出指示的错误

-(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....


}

我一直在挖掘,并找到了这个解决方案,但我仍然收到错误。

-(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];
}

这让我疯了。而且让我更加困惑,将CGPoint改为NSPoint就像这样

-(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)];
}

摆脱setPosition中的错误,但我仍然搞砸了setViewPointCenter。据我了解,CGPoint和NSPoint应该完全相同,但它看起来不一样。

有没有人有一个如何在字典中传递CGPoint的工作示例?我无法弄清楚。

这适用于iPhone,这有所不同。

5 个答案:

答案 0 :(得分:13)

尝试使用+[NSValue valueWithCGPoint]

答案 1 :(得分:6)

我会使用NSStringFromCGPoint() function将其转换为字符串,然后使用CGPointFromString() function将其转换回来。

答案 2 :(得分:1)

您可以使用+numberWithFloat:将CGPoint中的x和y值封装到NSNumber对象中,然后将两个生成的NSNumber对象添加到字典中。然后,您可以使用以下方法重建另一侧的CGPoint:

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

它在第一次尝试中不起作用的原因是CGPoint不是一个对象,它是一个C结构。

答案 3 :(得分:0)

我还没有读过GCNSPoints,但NSDictionary可以保留哪些数据类型?检查文档,也许您应该将其转换为NSData

答案 4 :(得分:0)

在@Ben Gottlieb给出答案之后已经过了很长时间,他的回答很好,但是为了将来我还有一个例子可供参考。

// 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));
}

应该记录(10,10)