2012-03-31 76 views
2

我在NSUserDefauts中存儲和檢索浮點數時遇到問題。我保存的價值,但是當我找回它,則返回0。如何從NSUserDefaults存儲檢索浮點數

這裏是我的嘗試,並沒有工作:

[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中檢索到浮點數時,它們都返回零。

任何幫助表示讚賞。 謝謝!

+0

'pref'幾乎肯定是零。顯示您分配前置碼的代碼。它與上面的代碼在哪裏? – jrturton 2012-03-31 15:13:28

回答

3

在代碼中的第一個例子是好的,假設這行:

NSUserDefaults *pref = [NSUserDefaults standardUserDefaults]; 

纔出現。正如我在我的評論中所建議的,您所看到的行爲表明pref爲零。

+0

,非常感謝!就是這樣!我實際上在.h文件中聲明瞭pref,並將其合成到我的.m文件中。我可以不這樣做NSUserDefault? – 2012-03-31 20:46:42

+0

合成只是創建訪問器方法。您仍然需要在某個時刻爲該屬性分配一個值。 – jrturton 2012-03-31 21:24:00

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

不需要將float轉換爲NSUserDefaults的'NSNumber'。 jrturton, – zaph 2012-03-31 15:56:52

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 
} 
+0

想知道爲什麼要檢查'[NSUserDefaults standardUserDefaults]',因爲如果返回'nil',系統就會被關閉並且它還沒有崩潰。 :-)類似於檢查'[NSData data]'是否返回'nil',我們有理由不檢查。 – zaph 2012-03-31 16:59:06

8

保存

-(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"]; 
0

試試這個:

  1. 存儲

- (空)sliderAction:(ID)發送

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

2 。回顧

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

那麼,沒有人似乎已經明確地解決了OP的問題。
OP在.h文件中聲明瞭NSUserDefaults,並且只是試圖在.m文件中訪問它,而沒有實際分配pref實例。
對於初學編程的緣故,這意味着在.h聲明實例:
NSUserDefaults * pref;

,並在您.m方法,把這個試圖訪問它之前:

pref = [NSUserDefaults standardUserDefaults];

似乎對某些人來說顯而易見,但偶爾可以趕上你。您將理想把這個地方像viewDidLoad,但如果你通過一些像訪問一個共享實例在類中的方法,然後在方法你可能從把

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

你需要訪問它之前受益,只是以確保它已分配內存。
希望這可以幫助別人!