Question

I have an integer stored in user defaults for my game's high score. Every time I start the game I want to check if the score is bigger than the previous high score, so I do this:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setInteger:highScoreNum forKey:@"highScoreNumber"];

if (highScoreNum <= score) {
   highScoreNum = score;

   SKLabelNode *highLabel = (SKLabelNode *)[self childNodeWithName:@"highLabel"];
   highLabel.text = [NSString stringWithFormat:@"%ld", (long)highScoreNum];

   NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
   [defaults setInteger:highScoreNum forKey:@"highScoreNumber"];
}
else if (highScoreNum > score) {
   SKLabelNode *highLabel = (SKLabelNode *)[self childNodeWithName:@"highLabel"];
   highLabel.text = [NSString stringWithFormat:@"%ld", (long)highScoreNum];

   NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
   [defaults setInteger:highScoreNum forKey:@"highScoreNumber"];
}

and at the place where I declare the variable I do this:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setInteger:highScore forKey:@"highScoreNumber"];
highLabel.text = [NSString stringWithFormat:highScore];

but I always get 0 in highScoreNum.

Was it helpful?

Solution

Every time you do this...

[defaults setInteger:highScore forKey:@"highScoreNumber"];

...you send the highScore variable to the defaults. If you declare highScore, but then don't fetch a previously saved default (or don't otherwise initialize highScore), then it makes sense why you keep seeing zero here. You probably keep sending nil to the defaults, which go in (and come back out) as an integer value of zero.

Immediately after you declare *defaults, instead of calling setInteger:forKey, you probably want to have highScore store the appropriate value from the defaults, which looks like this:

highScore = [defaults integerFromKey:@"highScoreNumber"];

Also, don't forget to [defaults synchronize] when appropriate.

OTHER TIPS

setInteger:forKey::

Sets the value of the specified default key to the specified integer value.

So your code stores a value to the NSUserDefaults, in several places. It never reads a value back.

(and you should look up -synchronize)

Try this

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setInteger:highScoreNum forKey:@"highScoreNumber"];
[defaults synchronize]; // force the upgrade NSUserDefaults
if (highScoreNum <= score) {
     highScoreNum = score;

     SKLabelNode *highLabel = (SKLabelNode *)[self childNodeWithName:@"highLabel"];
     highLabel.text = [NSString stringWithFormat:@"%ld", (long)highScoreNum];

     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
     [defaults setInteger:highScoreNum forKey:@"highScoreNumber"];
 }
 else if (highScoreNum > score) {
     SKLabelNode *highLabel = (SKLabelNode *)[self childNodeWithName:@"highLabel"];
     highLabel.text = [NSString stringWithFormat:@"%ld", (long)highScoreNum];

     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
     [defaults setInteger:highScoreNum forKey:@"highScoreNumber"];
     [defaults synchronize]; // force the upgrade NSUserDefaults
 }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top