0

我正在尝试将我的游戏的当前级别存储在 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
4

3 回答 3

5

只需确保在 NSUSerDefaults 上调用同步:

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);
于 2012-09-26T04:13:58.380 回答
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"];

"integerForKey:"是使用 " setInteger:forKey:" 时使用的正确方法。

于 2012-09-26T04:19:29.517 回答
0

哦。我的。上帝。我是个白痴。我忘记了我定义了一个自定义 setLevelNum 方法来防止将级别设置在现有级别的范围之外。由于上面的代码发生在我定义级别集之前,它会自动将其设置为最低级别,即 1。删除它现在它可以工作了。谢谢大家的帮助。至少我学到了很多关于 Objective-C 数据类型的知识 :-)

于 2012-09-26T04:50:20.530 回答