2012-03-06 16 views
8

NSUserDefaultsにいくつかの設定を保存しようとしていますが、アプリケーションはsetBoolの値を保存していないようです。NSUserDefaults。 setValueは動作しませんsetBool

これは動作します:

[[NSUserDefaults standardUserDefaults] setValue: @"hello" forKey: @"test"]; [[NSUserDefaults standardUserDefaults] synchronize];

私はアプリを終了して再起動すると、値が保存されています。ただし、私がこれを行うとき:

[[NSUserDefaults standardUserDefaults] setBool: YES forKey: @"test"]; [[NSUserDefaults standardUserDefaults] synchronize]; 私は、アプリケーションを閉じて再起動しても保存されません。

私はバグレポートを提出する必要がありますか?または、私がここで不足しているものがありますか?

おかげ

編集:

私は私が間違って何をしたか把握します。 AppDelegateで、私はboolForKeyが設定されているかどうかを確認したかった、そしてそれは私がこれをしなかったではなかった:「!」

if (![defaults boolForKey: @"test123"]) 
[defaults setBool: YES forKey: @"test123"]; 

...しかし、それはboolWithKeyに来るとき、 boolがYESかNOかどうかを確認してください。

答えて

9

どうしたらうまくいかないのですか?私はあなたのコードを試して、それは私のために働く。あなたはそれを書いた後に正しい方法でブール値を読んでいるのですか?

このコードは動作するはずです

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults setBool:NO forKey:@"test"]; 

[defaults synchronize]; 

BOOL myBool = [defaults boolForKey:@"test"]; 
+1

同期を忘れました:Oo –

+2

NOが設定されていない場合、デフォルト値です。上記のコードは何もテストしません。テストが意味をなさなくするためには、それを試してみる必要があります。 – Marc

1

私は正確に同じ問題を抱えていました。 BOOL以外のものはすべて正しく保存されていました。しかし、私はいくつかの古いコーディングスタイルを使っていました。このようにコード化されたものはすべて動作します。ここ

誰が古い本を使用している場合....は一例であり

悪いもの:

//////////// set/get bL2R 
if (![[NSUserDefaults standardUserDefaults] 
     boolForKey:kL2RomanizationChoice]) { 
    [[NSUserDefaults standardUserDefaults] 
    setBool:YES 
    forKey:kL2RomanizationChoice]; 
    bL2R = YES; 
    NSLog(@"L2Rom not found, set to YES."); 
} 
else { 
    bL2R = [[NSUserDefaults standardUserDefaults] 
       boolForKey:kL2RomanizationChoice]; 
    NSLog(@"L2Rom found."); 
    if (bL2R) { 
     NSLog(@"L2Rom found to be YES."); 
    } 

} 

良いもの:

if (![defaults boolForKey:kL2RomanizationChoice]) 
    [defaults setBool:YES forKey:kL1RomanizationChoice]; 

L2String_Setting = [defaults objectForKey:kSecondLangChoice]; 
bL2R = [defaults boolForKey:kL2RomanizationChoice]; 

更新:悲しいことに、このだけに見えましたXcode 4.5.2を使用して、もう一度失敗しています。 boolを整数に置き換えるだけかもしれません...

1

XCode 4.6は、hangzhouharryによって強調された同じ問題を持っているようです。役に立つ値の呼び出しは、[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]で、キーの値が正しいかどうかを調べることができます。

たとえば、 - > autoLogout = 0;何

返さない[設定をintegerForKey: "自動ログアウト" @]:ブール、[ "自動ログアウト" @設定boolForKeyが]と設定した

は0(ソートの、予想される、として)返し

2

I私のAppDelegateに次のコードを入れて、ウォークスルーを表示する特定のviewControllerをユーザが見たかどうかを追跡し、ユーザがそれを見た後にこのBoolをNOに設定することによって同じ問題を抱えていました。

if (![standardUserDefaults boolForKey:@"firstViewOfVC"]) { 
     [standardUserDefaults setBool:YES forKey:@"firstViewOfVC"]; 
} 

しかし、その後、あなたがにNO後でそれを設定し、それが「存在する」場合は、あなたが実際にはブール値を見ていないし、yesに戻ってそれを設定しているチェックするとき。クイックフィックスはNSNumberオブジェクトにboolean値を格納するだけで、その値がYESかNOかに関係なく存在を確認できるようになります。下記を参照してください:

if (![standardUserDefaults objectForKey:@"firstViewOfVC"]){ 
     [standardUserDefaults setValue:[NSNumber numberWithBool:YES] forKey:@"firstViewOfVC"]; 
    } 
関連する問題