如何在 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)
总是正确的
已编辑
我不明白如何正确使用 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)
总是正确的
已编辑