[英]`NSUserDefaults` not saving float properly
I am building an application in which I want to save some user data by using NSUserDefaults
, and it is a property of one of my controllers as following: 我正在构建一个应用程序,我想使用NSUserDefaults
在其中保存一些用户数据,它是我的一个控制器的属性,如下所示:
@property (nonatomic, strong) NSUserDefaults *userPreference;
@synthesize userPreference = _userPreference;
And I am trying to save something called a scale
that should be a float, so I do something like this in the getter to put in some default values of scale
in case user did not enter one: 而且我正在尝试保存一个称为scale
东西,它应该是一个浮点数,因此我在getter中执行了类似的操作,以放置一些scale
默认值,以防用户没有输入一个默认值:
if (!_userPreference) {
_userPreference = [NSUserDefaults standardUserDefaults];
}
if (![_userPreference floatForKey:@"scale"]) {
// if user has not entered this info yet
// also 0 is not a valid value so I can do this
[_userPreference setFloat:100.0 forKey:@"scale"]; // let default scale be 100.0
[_userPreference synchronize];
}
However, when I later on query this, no matter what I set in the default value, the following command: 但是,以后查询时,无论我在默认值中设置了什么,都将使用以下命令:
[self.userPreference floatForKey:@"scale"];
always return 1
. 总是return 1
。 I am not sure what is happening. 我不确定发生了什么。 Am I not creating the NSUserDefaults
correctly? 我没有正确创建NSUserDefaults
吗?
Thank you in advance! 先感谢您!
Store using 储存使用
[_userPreference setObject:[NSNumber numberWithFloat:100.0] forKey:@"Scale"];
[_userPreference synchronize];
and retrieve it using 并使用
float value = [[_userPreference objectForKey:@"Scale"] floatValue];
if you want to use NSUserDefaults, do not create any variables or @propertys. 如果要使用NSUserDefaults,请不要创建任何变量或@propertys。 Just use 只需使用
[[NSUserDefaults standardUserDefaults] setFloat:forKey:]
[[NSUserDefaults standardUserDefaults] synchronize];
to save your data and 保存您的数据并
[[NSUserDefaults standardUserDefaults] floatForKey:]
for fetching data. 用于获取数据。
Have you tried this to set the float value: 您是否尝试过设置浮点值:
[_userPreference setObject:[NSNumber numberWithFloat:100.0f] forKey@"scale"];
and the following to retrieve: 和以下内容进行检索:
CGFloat scale = [[_userPreference objectForKey@"scale"] floatValue];
Change your if
condition to this: 将您的if
条件更改为此:
if ([_userPreference floatForKey:@"scale"] == 0.0f ) {
NSUserDefaults will always return 0.0f if no value is set for the key. 如果未为密钥设置任何值,NSUserDefaults将始终返回0.0f。 Since you are saying that "also 0 is not a valid", you can safely use this approach 由于您说的是“ 0也无效”,因此可以安全地使用此方法
try this 尝试这个
-(void) saveFloatToUserDefaults:(float)x forKey:(NSString *)key {
NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setFloat:x forKey:key];
[userDefaults synchronize];
}
-(float) retriveFromUserDefaultsForKey:(NSString *)key {
NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
return [userDefaults floatForKey:key];
}
[self saveFloatToUserDefaults:6.55 forKey:@"myFloat"];
float x = [self retriveFromUserDefaultsForKey:@"myFloat"];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.