3

キーの値を変更しようとするまで有効な userDefault bool キーを作成しています。キーの値を変更したら、キーがアプリケーション バンドルから消えたようです。たとえば、次のコードは GameManager (ゲーム アプリのすべてのレベルを提供するシングルトン) の init ルーチンにあり、アプリが最初に読み込まれたときに実行されます。

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];   // get the shared defaults object
    if (defaults) {

        if ([defaults boolForKey:@"Sound Effects ON"]) {
            isSoundEffectsON = [defaults boolForKey:@"Sound Effects ON"];
        }
        else {
            [defaults setBool: YES forKey:@"Sound Effects ON"];
            isSoundEffectsON = YES;

            [defaults synchronize]; // save the initial state
        }
    }

このコードが最初に入力されたとき、@"Sound Effects ON" の userDefault が現在存在しないため、実行パスは else 句を使用します。@"Sound Effects ON" に対して他に何もせずにアプリを再起動すると (したがって、このコードを再入力します)、実行パスは if 句を取り、@"Sound Effects ON" の格納された値を取得します (これは、キーが有効になったことを示します)。アプリケーション バンドルに正常に保存されます)。

後で、ゲーム レベルの 1 つが実行されているときに、ユーザーがこのキーの値を変更することを決定すると、次のコードが実行されます。

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];   // get the shared defaults object
if ([[GameManager sharedGameManager] isSoundEffectsON]) {
    [[GameManager sharedGameManager] setIsSoundEffectsON:NO];

    if (defaults) {
        // Update the state for sound effects
        [defaults setBool: NO forKey:@"Sound Effects ON"];

        [defaults synchronize]; // save the current state
    }
} else {
    [[GameManager sharedGameManager] setIsSoundEffectsON:YES];

    if (defaults) {
        // Update the state for sound effects
        [defaults setBool: YES forKey:@"Sound Effects ON"];

        [defaults synchronize]; // save the current state
    }
}

isSoundEffects が以前にオンであった場合、@"Sound Effects ON" bool が NO に設定され、userDefault が同期されます (おそらく値を保存するため)。この実行パスが使用されると、このキーの userDefault がアプリケーション バンドルから削除されたように見えます。アプリがリロードされ、GameManager init のコードが再度実行されると、else 句が実行され、@"Sound Effects ON" の userDefault キーがないことが示されるためです。

私は何が欠けていますか?このキーが消えているのはなぜですか?

4

2 に答える 2

1

設定されている BOOLNOは、事実上、存在しないキーと同じです。どちらの場合もif ([defaults boolForKey:@"Sound Effects ON"]) {トリガーしません。

ifあなたの問題は、ブール値がどのように機能するか、またはステートメントがどのように機能するかについての基本的な誤解のようです。

たとえば、次のコード:

    if ([defaults boolForKey:@"Sound Effects ON"]) {
        isSoundEffectsON = [defaults boolForKey:@"Sound Effects ON"];
    }

に等しい

    if ([defaults boolForKey:@"Sound Effects ON"]) {
        isSoundEffectsON = YES;
    }

ユーザーのデフォルトから値を再度要求する必要はありません。

于 2013-11-03T15:58:03.670 に答える