我正在尝试在NSUserDefaults中存储我的游戏的当前级别,但是当我尝试将其转换为int时它总是返回1。这是测试代码:
[[NSUserDefaults standardUserDefaults] setInteger:34 forKey:@"Current Level"];
NSLog(@"default level raw: %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"Current Level"]);
self.levelNum = [[[NSUserDefaults standardUserDefaults] objectForKey:@"Current Level"] intValue];
NSLog(@"default level num: %i", self.levelNum);
输出:
default level raw: 34
default level num: 1
答案 0 :(得分:5)
只需确保在NSUSerDefaults上调用synchronize:
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
[defaults setInteger:34 forKey:@"Current Level"];
NSLog(@"default level raw: %@", [defaults objectForKey:@"Current Level"]);
[defaults synchronize]; // Call synchronize after set
self.levelNum = [defaults integerForKey:@"Current Level"];
NSLog(@"default level num: %i", self.levelNum);
答案 1 :(得分:3)
您的代码的一个方面是您使用的是“setInteger
”(这是一个NSInteger)
[defaults setInteger:34 forKey:@"Current Level"];
与
self.levelNum = [[[NSUserDefaults standardUserDefaults] objectForKey:@"Current Level"] intValue]
假设您正在返回一个NSNumber对象,您正在从该对象中读取“int
”(不一定与“NSInteger
”相同)。
使用:
而不是第二次调用self.levelNum = [[NSUserDefaults standardUserDefaults ] integerForKey: @"Current Level"];
当您使用“setInteger:forKey:
”时, "integerForKey:"
是正确的方法。
答案 2 :(得分:0)
喔。我的。神。我是个白痴。我忘了我定义了一个自定义setLevelNum方法,以防止将级别设置在现有级别的范围之外。由于上面的代码在我定义级别集之前发生,它会自动将其设置为最低级别,即1.删除它,现在它可以工作。谢谢大家的帮助。至少我学到了很多关于Objective-C数据类型的知识: - )