如何在 objective c 的 AppDelegate 中加载 NSUserDefaults standardUserDefaults

how to load NSUserDefaults standardUserDefaults in AppDelegate in objective c

我不明白如何正确使用 NSUserDefaults standardUserDefaults。我有 GameOver.m 文件,是否检查了分数是否为高分,如果是,它会像这样保存:

if(score > highScore){
  highScore =score;
  bestScore = highScore;

  NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
  [prefs setInteger:bestScore forKey:@"bestScore"];
  [prefs synchronize];
}

要加载我使用的高分:

NSUserDefaults *prefs =[NSUserDefaults standardUserDefaults];
NSInteger theHighScore =[prefs integerForKey:@"bestScore"];

它可以工作,但是在应用程序关闭并重新打开后,highscore 消失了,我读到,加载过程需要在 - (void)applicationDidEnterBackground:(UIApplication *)application 的 AppDelegate 文件中,我该怎么做?

编辑
GameScene.m

-(void)Scoring {
  NSUserDefaults *scoreprefs = [NSUserDefaults standardUserDefaults];
  [scoreprefs setInteger:score forKey:@"score"];
}

GameScene.m

#import "GameScene.h"
@implementation GameOver
NSInteger score;
NSInteger highScore;
NSInteger bestScore;

- (id)initWithSize:(CGSize)size playerLose:(BOOL)isLose {
  self = [super initWithSize:size];
  if (self) {
    NSUserDefaults *scoreprefs =[NSUserDefaults standardUserDefaults];
    NSInteger score = [scoreprefs integerForKey:@"score"];

    SKLabelNode *scorelabel = [SKLabelNode labelNodeWithFontNamed:@"Menlo-Bold"];
    scorelabel.text =[NSString stringWithFormat:@"%ld",(long)score];
    // then i define position/fontsize for scoreLabel
    [self addChild:scorelabel];

    if(score > highScore){
      highScore =score;
      bestScore = highScore;

      NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
      [prefs setInteger:bestScore forKey:@"bestScore"];
      [prefs synchronize];
    }

    NSUserDefaults *prefs =[NSUserDefaults standardUserDefaults];
    NSInteger theHighScore =[prefs integerForKey:@"bestScore"];
    SKLabelNode *highscorelabel = [SKLabelNode labelNodeWithFontNamed:@"Menlo-Bold"];
    highscorelabel.text =[NSString stringWithFormat:@"%ld",(long)theHighScore];
    //define position/fontsize for highscorelabel
  }
  return self;
}

就是这样。

您不是在获取高分数据。因此以下条件每次都成立,因为 highScore 变量将为 0。在此阶段,即使 bestScore 大于 [=14],bestScore 也会被当前分数覆盖=]

if(score > highScore){ //Will be true always. Not proper condition.
  highScore =score;
  bestScore = highScore;

  NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
  [prefs setInteger:bestScore forKey:@"bestScore"];
  [prefs synchronize];
}
@interface GameOver ()
@property (nonatomic, assign) NSInteger score;
@property (nonatomic, assign) NSInteger highScore;
@property (nonatomic, assign) NSInteger bestScore;
@end

@implementation GameOver
@synthesize score,bestScore,highScore;

- (id)initWithSize:(CGSize)size playerLose:(BOOL)isLose {
    NSUserDefaults *scoreprefs =[NSUserDefaults standardUserDefaults];

    if (self = [super initWithSize:size]) {
        if (self) {

            score = [scoreprefs integerForKey:@"score"];
            highScore = [scoreprefs integerForKey:@"bestScore"];

            SKLabelNode *scorelabel = [SKLabelNode labelNodeWithFontNamed:@"Menlo-Bold"];
            scorelabel.text =[NSString stringWithFormat:@"%ld",(long)score];
            // then i define position/fontsize for scoreLabel
            [self addChild:scorelabel];

            if(score > highScore){
                highScore =score;
                bestScore = highScore;

                [scoreprefs setInteger:bestScore forKey:@"bestScore"];
                [scoreprefs synchronize];
            }

            SKLabelNode *highscorelabel = [SKLabelNode labelNodeWithFontNamed:@"Menlo-Bold"];
            highscorelabel.text =[NSString stringWithFormat:@"%ld",(long)highScore];
            //define position/fontsize for highscorelabel
        }

    }
        return self;
}

问题是你没有初始化你的 HighScore ,并检查

score(assume 5242)>highScore(nil)

总是正确的

已编辑