我正在尝试在一个名为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,这有所不同。
答案 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)
我还没有读过GC
和NSPoints
,但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)
。