11

アプリに設定バンドルを追加したところ、bool 設定の読み取りに問題があります。アプリの起動時に、ユーザーが実際に入力しない限り設定が読み取られないことを知っています-それが私がキャプチャしようとしているものです。

ただし、私のコードは、答えが NO であるか、設定されていない場合にキャプチャするだけです。それらが設定されているかどうかを確認する必要があり、それから答えを設定します!

設定コード:

BOOL playSound;
BOOL playVibrate;


//test for some defaults
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
if (![prefs boolForKey:@"pref_sound"]) {
    playSound = YES;
    playVibrate = YES; 
} else {
    playSound = [prefs boolForKey:@"pref_sound"];
    playVibrate = [prefs boolForKey:@"pref_vibrate"]; 
}


if (playSound) {
//do stuff
}

問題は、ユーザーが設定を「いいえ」に設定すると、コードがバイブレーションとサウンドの両方を「はい」に変更することです。これは、設定しないためのキャプチャであることを意味します....

何か案は?

4

3 に答える 3

17

まず、if条件にバグがあります。boolForKey:ドキュメントによると、まだ設定されていない場合は NO を返すブール値自体をチェックしています。そのboolForKey:ため、それを行う正しい方法ではありません。

他に2つのアイデアがあります。

設定が初期化されているかどうかを指定するには、別のキーで別の設定を使用することを検討してください。アプリを起動するとき、または最初に設定を読み取るときに確認してください。必要に応じて初期化します。例えば:

- (void) initializeUserDefaults {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if (nil == [defaults objectForKey:@"initialized_defaults"]) {
        [defaults setBool:YES forKey:@"pref_sound"];
        [defaults setBool:YES forKey:@"pref_vibrate"];
        [defaults setObject:@"dummy_value" forKey:@"initialized_defaults"];
    }
}

より簡単な解決策(ただし、これが機能するかどうかはわかりません)は、条件を次のように変更することです。

if (![prefs objectForKey:@"pref_sound"]) {

繰り返しますが、これが私が想像しているとおりに機能するかどうかはわかりませんがobjectForKey:、基になるボックス化されたブール値オブジェクトが存在する場合、またはnil.

アプリの新しいバージョンに新しい設定を追加する場合、新しい設定を初期化せずに残したくないし、ユーザーの既存の設定を踏みにじる必要はありません。この 2 番目の方法を使えば簡単にできますが、最初の方法では失敗しやすくなります。しかし、最初の方法でもすべての設定が 1 か所に集められるので、どのように動作するかを確認できます。これは私が気に入っています。

ただし、どの ADC ドキュメントがベスト プラクティスと見なすかはわかりません。NSUserDefaultsそれを見つけるには、クラス リファレンスから参照されているコード サンプルを確認することをお勧めします。

于 2009-12-27T14:37:53.800 に答える
0

ケビン・コナーの解決策は私にとってはうまくいきますが、指摘すべきことがもう1つあります。

私のアプリは利き手を優先し、デフォルトは右利きです。Xcode で実行を押し、アプリを使用して設定を左利きに変更し、もう一度実行すると、私の設定はまだ右利きのままです。

Xcodeで実行すると設定が消去されるようです。シミュレーター内から手動でアプリを終了し、内部から再度開くことにしました。その後、新しい設定が表示されました。

于 2012-07-12T19:27:58.743 に答える