如何将浮点数存储在NSUserDefaults中并检索

4

我遇到了在 NSUserDefaults 中存储和检索浮点数的问题。我已经成功将值存储,但是当我尝试检索它时,它返回 0。

以下是我尝试过但没有成功的方法:

[pref setFloat:3.0f forKey:@"key"];
float value = [pref floatForKey:@"key"]; //value=0

[pref setFloat:3 forKey:@"key"];
float value = [pref floatForKey:@"key"];//value=0

[pref setObject:[NSNumber numberWithFloat:3] forKey:@"key"];
float value = [[pref objectForKey:@"key"]floatValue];//value=0

[pref setObject:[NSNumber numberWithFloat:3.0f] forKey:@"key"];
float value = [[pref objectForKey:@"key"]floatValue];//value=0

这里我做错了什么?我尝试了这4段代码,但从NSUserDefaults中检索浮点数时它们都会返回零。
非常感谢您的帮助。

pref 几乎肯定是 nil。展示你赋值 pref 的代码。它与上面的代码相比在哪里? - jrturton
7个回答

9

保存

-(void) saveFloatToUserDefaults:(float)x forKey:(NSString *)key {
    NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setFloat:x forKey:key];
    [userDefaults synchronize];
}

加载

-(float) loadFloatFromUserDefaultsForKey:(NSString *)key {
    NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
    return [userDefaults floatForKey:key];
}

如何操作

[self saveFloatToUserDefaults:5.241 forKey:@"myFloat"];
float x = [self loadFloatFromUserDefaultsForKey:@"myFloat"];

3
您好!以下是您需要翻译的内容:

您代码中的第一个示例很好,假设这行代码:

NSUserDefaults *pref = [NSUserDefaults standardUserDefaults];

出现在它之前。正如我在评论中建议的那样,你所看到的行为表明pref是空的。


jrturton,非常感谢!就是这个问题!!我实际上在我的.h文件中声明了pref,并在我的.m文件中合成了它。我能不能用NSUserDefault来做到这一点? - Rafael Moreira
合成只会创建访问器方法。你仍然需要在某个时刻为属性分配一个值。 - jrturton

1

请尝试以下方法:

  1. 用于存储

-(void)sliderAction:(id)sender

{
   [[NSUserDefaults standardUserDefaults] setFloat:fontSlider.value forKey:@"keyFontSize"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

2. 用于检索(获取)数据。

-(void)retrive
{
   NSLog(@"%f",[storedata floatForKey:@"keyFontSize"]);
}

1
[[NSUserDefaults standardUserDefaults]setObject:[NSNumber numberWithFloat:3] forKey:@"key"];

1
不需要将浮点数转换为 NSNumber 以在 NSUserDefaults 中使用。 - zaph

0

嗯,似乎没有人明确解决了原帖作者的问题。
原帖作者在.h文件中声明了NSUserDefaults,并且只是在.m文件中尝试访问它,而没有实际分配预设实例。
为了初学者编程人员的利益,在.h中声明实例:
NSUserDefaults * pref;

在您的.m方法中,在尝试访问之前,请添加以下内容:

pref = [NSUserDefaults standardUserDefaults];

对于一些人来说这似乎很明显,但有时候会让你措手不及。理想情况下,您应该将其放在像viewDidLoad这样的地方,但如果您通过类似共享实例的方式访问该类中的方法,则在方法中放置此代码可能会更好。

if(!pref){ 
pref = [NSUserDefaults standardUserDefaults];
}

在你需要访问它之前,确保已经分配了内存。
希望这能帮助到某些人!


0

NSUserDefaults 特殊处理浮点数以及其他几种本地的 "C" 类型。

[[NSUserDefaults standardUserDefaults] setFloat:3 forKey:@"key"];

float value = [[NSUserDefaults standardUserDefaults] floatForKey:@"key"];
NSLog(@"value: %.0f", value);

NSLog 输出:
数值:3


0
NSUserDefaults *pref = [NSUserDefaults standardUserDefaults];
if (pref) {
   [[NSUserDefaults standardUserDefaults] setFloat:3 forKey:@"key"];

   //for accessing
   float value = [pref floatForKey:@"key"]; //if key does not exist, value will be zero
}

想知道为什么要检查[NSUserDefaults standardUserDefaults],因为如果返回nil,系统就会崩溃。这很奇怪,它还没有崩溃。:-) 这类似于检查[NSData data]是否返回nil,但我们通常不会检查。 - zaph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接