2017-02-20 22 views
0

因爲我在一個Integer值中存儲一個Integer值到NSUserDefaults,在很多地方使用它。在第一次的工作正常,但同時我關閉我的應用程序,然後再次打開它,我檢查已經選擇在過去feom NSUserDefaults儲值的任何選項,用戶,但我沒在NSNotFound不能與NSUser一起使用默認

有些事情是錯誤的,我的情況下

這裏是我的檢查整數值的代碼是在有userdefault

NSInteger selectedBusinessUnit = [[NSUserDefaults standardUserDefaults] integerForKey:@"selectedUnit"]; 

if (selectedBusinessUnit != NSNotFound){ 
    //go to direct main screen. 
}else { 
// load Business unit screen for selection. 
} 

但它總能找到價值,即使我正在刪除應用程序,並reinastall它。

總是我的選定值是。

讓我知道這裏我的愚蠢的錯誤是什麼。

編輯:

[[NSUserDefaults standardUserDefaults] setInteger:sender.tag forKey:@"selectedUnit"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

THNAKS。

+0

朋友你可以顯示你的setInteger:forKey代碼? –

+0

我相信你在設定價值時做錯了什麼。 –

+1

請考慮'NSNotFound'是一個有效的整數值。這不等於'nil'或*鍵丟失*。正如答案中所述,如果密鑰丟失,'integerForKey'返回0。根本不同的標籤分配給'sender'(默認也是0)? – vadian

回答

2

顯然有一個誤區:NSNotFound不等於密鑰丟失,這是一個有效的整數值。

保持邏輯的最簡單方法是將鍵值對與NSNotFound一起註冊爲默認值。

儘快(applicationDidFinishLaunching或更早)寫

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSDictionary *defaultValues = @{@"selectedUnit": @(NSNotFound)}; 
[defaults registerDefaults:defaultValues]; 

這意味着NSNotFound被視爲默認值,直到它覆蓋的第一次。每次啓動應用程序時,必須執行3行。如果應用程序重新安裝,則再次採用默認值。

現在你可以在問題中使用你的邏輯。注:寫完後你不需要synchronize。該框架定期進行。

+0

Thaks爲您的答案讓我檢查。 – BhaviDev

+0

太棒了! !它的工作完美,學到了新東西,我們可以像這樣註冊默認值許多感謝瓦迪亞。 – BhaviDev

+0

@BhaviDev我不明白爲什麼你每次都得到零值,即使我的代碼在我的情況下工作。 –

1

爲整數。缺省值是0,根據文檔:

-integerForKey:相當於-objectForKey :,不同之處在於它轉換返回的值到一個NSInteger。如果值爲 NSNumber,則會返回-integerValue的結果。如果值 是一個NSString,則它將在可能的情況下轉換爲NSInteger。如果 的值是一個布爾值,則它將被轉換爲1或YES,如果是 NO。如果該值不存在或無法轉換爲整數,則返回0將返回 。

如果要檢查是否有鍵NSUserDefaults的存在

使用:

if ([[NSUserDefaults standardUserDefaults] objectForKey:@"selectedUnit"] != nil) 
{ 
... 
} 
+0

但我的價值是整數不以對象的形式,所以它會與intergerForKey一起工作嗎? – BhaviDev

+1

你可以嘗試將它保存爲NSNumber而不是NSInteger,然後在結果對象上使用intValue,而不是像這樣保存:setObject:@(integer),它會給你一個更好的結果 – unkgd

+0

是的,我知道我可以使用NSNumber insted整數,但我的問題是有什麼辦法來檢查整數有價值或不像NSNotFound工作與整數值。 – BhaviDev

-1

您可以設置對象像

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
[userDefaults setObject:@(yourIntegerValue) forKey:@"yourIntegerKey"]; 
[userDefaults synchronize]; 

,你可以檢查這樣

NSNumber *integerValue = [userDefaults objectForKey:@"yourIntegerKey"]; 
if (integerValue) { 
    // 
} 
+0

我們如何直接存儲Integer,因爲在設置對象和傳遞Integer時,這不起作用。 – BhaviDev

+2

'NSUserDefaults'有專用的'setInteger:forKey'和'integerForKey:'方法。不需要使用'object'。 – vadian

+0

你可以設置整數對象像@(整數)或[NSNumber numberWithInt:0]或[NSNumber numberWithInteger:0] – zapdroid

0

NSUserDefaults存儲唯一對象,NSNumbers。 我認爲在NSNumber轉換的問題,你存儲爲方法integerForKey整數。

另一種情況 - 可能你忘了同步NSUserDefaults

相關問題