2009-10-20 3 views
6

다른 클래스에서 setViewPointCenter를 트리거하는 한 클래스에서 setPosition 메서드를 사용하여 Notification을 실행하려고합니다. 그러나, 나는 그것과 함께 CGPoint를 보내려고 노력하고있다. 그러나 Xcode는 그것을 1 비트 좋아하지 않습니다.코코아 : NSNotification 및 NSDictionary 함께 CGPoint 전달하는 문제

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

그것은 나를 미치게합니다. 그리고이

-(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처럼 NSPoint에 CGPoint 변경, 더욱 나를 혼동,하지만, 난 여전히 setViewPointCenter에 망하고있다. 그리고 내가 이해할 때, CGPoint와 NSPoint는 똑같은 것이어야하지만 그것들처럼 보이지는 않습니다.

사전에 CGPoint를 전달하는 방법에 대한 실무 사례가있는 사람이 있습니까? 나는 그것을 이해할 수 없다.

이것은 iPhone 용으로 다른 점이 있습니다.

답변

13

+[NSValue valueWithCGPoint]을 사용해보세요.

+1

더 빨리 찾았 으면 좋겠어. 이것으로 더 깊이 설명 할 수 있습니다. http://stackoverflow.com/questions/1032726/nsnotification-userinfo-example – gargantuan

1

+numberWithFloat:을 사용하여 CGPoint의 x 및 y 값을 NSNumber 객체로 캡슐화 한 다음 두 개의 결과 NSNumber 객체를 사전에 추가 할 수 있습니다. 그런 다음 사용하여 다른 쪽의 CGPoint를 재구성 할 수는 첫 번째 시도에서 작동하지 않았다

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

이유는 CGPoint 개체 아니라고했다, 그것은 C 구조체입니다.

0

내가 GCNSPoints을 읽지 않았지만 NSDictionary은 어떤 데이터 유형을 보유 할 수 있습니까? 문서를 확인하십시오. 어쩌면 NSData으로 전송해야합니다.

6

NSStringFromCGPoint() function을 사용하여 문자열로 변환 한 다음 CGPointFromString() function을 사용하여 다시 변환 할 수 있습니다.

+0

링크가 깨졌습니다. 두 가지 기능이 모두있는 새로운 링크 : https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIKitFunctionReference/Reference/reference.html – cprcrack

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