2 Stimmen

Warum wird mein durch NSNotifcationCenter übergebener Wert nicht beibehalten?

Ich versuche, einen CGPoint über eine NSNotification wie folgt zu senden

-(void)setPosition:(CGPoint)point
{ 
 NSString *pointString = NSStringFromCGPoint(point);

 NSDictionary *dict = [[NSDictionary alloc] 
                         initWithObjectsAndKeys:@"p", pointString, nil];

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

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

Und ich habe den Beobachter wie folgt implementiert

-(void) init
{
    if((self = [self init])){
       [[NSNotificationCenter defaultCenter]
       addObserver:self selector:@selector(setViewPointCenter:)           
       name:@"BownceSpriteDidSetPosition" 
       object:nil];

       // I wondered wether 'object' should be something else???

       // more code etc....
    }
    return self
}

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

 NSString * val = [[notification userInfo] objectForKey:@"p"];
 CGPoint point = CGPointFromString(val);

    // trying to debug
    NSString debugString = [NSString stringWithFormat:@"YPOS -----> %f", point.y];
 NSLog(debugString);

 CGPoint centerPoint = ccp(240, 160);
 viewPoint = ccpSub(centerPoint, point);

 self.position = viewPoint;
}

Aber es scheint, dass CGPoint leer ist, oder (0,0) vielleicht. So oder so, es ist nicht mit dem gewünschten Effekt, und die debugString zeigt point.y 0,0 sein.

Nach all den Beispielen, die ich gefunden habe, sieht es für mich so aus, als ob ich alles richtig machen würde. Aber offensichtlich tue ich das nicht. Kann mir jemand einen Schubs in die richtige Richtung geben und mich auf meinen Fehler hinweisen?

4voto

Dave DeLong Punkte 240835

Ihr Problem ist hier:

NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:@"p", pointString, nil];

So sollte es sein:

NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:pointString, @"p", nil];

Im Selektor steht "Objects" vor "Keys", so dass Sie Ihre Elemente als ObjectA, KeyForObjectA, ObjectB, KeyForObjectB usw. auflisten.

Sie sind auch undicht dieses Wörterbuch, da Sie alloc/init es, aber nie freigeben es (ich nehme an, Sie sind nicht mit Garbage Collection).

4voto

TechZen Punkte 64117

Sie haben Ihre Objekte und Schlüssel im Wörterbuch vertauscht. Es sollte lauten

 NSDictionary *dict = [[NSDictionary alloc] 
                         initWithObjectsAndKeys:pointString,@"p", nil];

Ja, es ist genau umgekehrt, wie man es erwarten würde, und das beißt mich etwa jedes dritte Mal, wenn ich ein Wörterbuch erstelle.

0voto

Maciej Gad Punkte 1551

In der neuen Objective-C-Syntax ist es besser, sie zu verwenden:

NSDictionary *dict = @{@"p": [NSValue valueWithCGPoint:point]};

leichter zu verstehen und zu nutzen NSValue anstelle von NSString .

Es gibt auch ein Problem mit dem Entfernen von Beobachtern. In Ihrem Code verwenden Sie nur [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(setViewPointCenter:) name:@"BownceSpriteDidSetPosition" object:nil]; aber niemals anrufen [[NSNotificationCenter defaultCenter] removeObserver:self]; was zu unangenehmen Abstürzen führen kann, die schwer zu beheben sind. Ich schlage vor, Sie verwenden die Bibliothek https://github.com/AllinMobile/AIMObservers die diese Art von Absturz verhindert. Sie könnten Ihren Code auf diese Weise umschreiben:

__weak __typeof(self) weakSelf = self;
self.observer = [AIMNotificationObserver observeName:@"BownceSpriteDidSetPosition" onChange:^(NSNotification *notification) {
   NSValue *valueOfPoint =  [notification userInfo][@"p"];
   CGPoint point = [valueOfPoint CGPointValue];
   CGPoint centerPoint = ccp(240, 160);
   viewPoint = ccpSub(centerPoint, point);
   //use weakSelf to avoid strong reference cycles
   weakSelf.position = viewPoint;
}];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X