0

NSUserDefaults を使用したアプリケーションの設定に関していくつか質問があります。

私の最後のアプリでは、バインディングを使用して設定を NSUserDefaults にリンクしましたが、これは完全に機能しました。アプリケーションのスタートアップ メソッドでは、NSUserDefaults に保存されている値に基づいてアクションを実行できます。

この問題は、アプリケーションを更新して再配布したときに発生し、すべての設定がコンピューターの設定で上書きされました。そのため、誰かが設定を変更してから更新を受信すると、その設定が私の設定で上書きされます。

環境設定の保存に関する Apple のドキュメントを振り返ると、環境設定をディスクに書き込むために使用されている次の行が使用されていないことに気付きました。

[defaults synchronize];

私の質問は、このコードはユーザーのハードドライブに設定を書き込むので、別の設定でアプリケーションを再配布すると、代わりに NSUserDefaults がディスクから読み取るようになりますか?

誤解を招いて申し訳ありませんが、答えが見つかりません。

よろしくお願いします。

4

2 に答える 2

3

バインディングを使用して設定を制御する場合は、 を使用する必要がありますNSUserDefaultsController。どちらの場合でも、デフォルトの初期値を設定するには、初期値で辞書を作成し、registerDefaults:バニラの NSUserDefaults を使用している場合、または NSUserDefaultsController のいずれかを使用している場合はinitWithDefaults:initialValues:、それをに渡す必要がありsetInitialValues:ます。NSUserDefaultsExample は次のとおりです。

- (void)applicationDidFinishLaunching {
    // For decent-sized applications, I normally like to store this in its own plist
    // but I'm creating it in-line here for readability's sake.
    NSDictionary *initialPreferences = [NSDictionary dictionaryWithObjectsAndKeys:
        [NSNumber numberWithInteger:21], @"UserAge",
        @"red", @"FavoriteColor",
        @"Idaho", "Location", nil];
    [[NSUserDefaults standardUserDefaults] registerDefaults:initialPreferences];
}
于 2012-05-01T17:19:42.180 に答える
0

NSUserDefaultssynchronizeが呼び出されたときにのみ書き込まれます。

アプリを出荷し、最初の起動時に特定の設定が必要な場合は、これらをコードで自分で設定する必要があります。私は通常、特定のキーの値を探しますnil。値が空の場合は、目的の「デフォルト」値を設定します。

アプリケーションの起動時にこれを行います。

NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];

/*  count how many times the user has launched the app  */
int total = [[defaults objectForKey:@"kLaunchCount"] intValue];  total++;
[defaults setObject:[NSNumber numberWithInt:total] forKey:@"kLaunchCount"];

/*  User chose to reset Scanner Feed, remove the .plist from Documents directory.  */
if ( [[defaults objectForKey:@"kResetScannerFeeds"] boolValue] == YES ){
    [[NSFileManager defaultManager] removeItemAtPath:SCANNERFEED error:nil];
    [defaults setObject:[NSNumber numberWithBool:NO] forKey:@"kResetScannerFeeds"];
}

/*  Check to see if Default Prefs are NULL, if so, enable them.  */
if ( [defaults objectForKey:@"kShakeToToggleVisibility"] == nil ){
    [defaults setObject:[NSNumber numberWithBool:YES] forKey:@"kShakeToToggleVisibility"];
}
if ( [defaults objectForKey:@"kBackgroundAudio"] == nil ){
    [defaults setObject:[NSNumber numberWithBool:YES] forKey:@"kBackgroundAudio"];
}
if ( [defaults objectForKey:@"kUseMyLocation"] == nil ){
    [defaults setObject:[NSNumber numberWithBool:YES] forKey:@"kUseMyLocation"];
}
if ( [defaults objectForKey:@"kAttachTwitterIcon"] == nil ){
    [defaults setObject:[NSNumber numberWithBool:YES] forKey:@"kAttachTwitterIcon"];
}
if ( [defaults objectForKey:@"kAttachTwitterLink"] == nil ){
    [defaults setObject:[NSNumber numberWithBool:YES] forKey:@"kAttachTwitterLink"];
}
/*  User chose to log out of Facebook Session, do that now.  */
if ( [[defaults objectForKey:@"kLogoutFacebook"] boolValue] == YES ){
    [defaults setObject:[NSNumber numberWithBool:NO] forKey:@"kLogoutFacebook"];
    [self fbLogout];
}

[defaults synchronize];
于 2012-05-01T17:09:13.110 に答える