2009-10-20 8 views
6

別のクラスのsetViewPointCenterをトリガーするあるクラスのsetPositionというメソッドでNotificationを起動しようとしています。しかし、私はそれと一緒にCGPointを送信しようとしています。しかし、Xcodeはそれを1ビット好きではありません。Cocoa: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オブジェクトにカプセル化し、2つの結果の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

@BenGottliebが答えを与えたあまりにも長い時間でした。彼の答えはよくですが、将来私は参考のために例を挙げています。

// 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)とする必要があります。

関連する問題