0

私は自分のアプリにこの(はるかに単純な)コードを持っています didFinishLaunchingWithOptions :

    NSDictionary *userDefaultsDefaults = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultsPrefs" ofType:@"plist"]];
    [[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsDefaults];

    NSLog(@"--------------- NSUserDefaults dump : %@", [prefs dictionaryRepresentation]);
    BOOL a = [[NSUserDefaults standardUserDefaults] synchronize];

しかし、何も書かれていません...つまり、設定ファイルは書かれていません。強制する[prefs setValue:someValue forKey:@"someKey"];と、このキー/値のみでファイルが作成されます

なんで ?すべてのデフォルト設定を設定してからディスクに書き込むにはどうすればよいですか?

BOOL a は YES です。
NSLog は、DefaultPrefs ファイルの内容全体と、次のようないくつかのシステム値を返します。

AppleICUForce24HourTime = 1; 
AppleKeyboardsExpanded = 1;
4

3 に答える 3

2

すべてのデフォルト設定を設定してからディスクに書き込むにはどうすればよいですか?

なぜ?ディスクに何も書き込まれないということは、デフォルトの全体的なポイントです。これらはデフォルト値であり、ユーザーが設定するものではなく、プログラムの新しいバージョンで変更される可能性があります。
それらが設定ファイルに保存されることは望ましくありません。それらが保存されると、ユーザーによって変更されたプリファレンスとデフォルト値を区別できないため、それらを新しいデフォルトに置き換えることはできません。

これは、本来あるべきように動作します。

設定ファイルに書き込みたい場合は、[[NSUserDefaults standardUserDefaults] setObject:foo forKey:bar]

本当に必要な場合は、for ループを使用して実行できると思います。

for (NSString *key in userDefaultsDefaults) {
    [[NSUserDefaults standardUserDefaults] setObject:[userDefaultsDefaults objectForKey:key] forKey:key];
}

ただし、これらのデフォルトを本当に保存する必要があるかどうかを再検討する必要があります。これを行う正当な理由が思いつきません。

于 2011-03-26T15:24:10.213 に答える
0

コードを複製し、さらにデバッグ ステートメントを追加すると、希望どおりのように見えます。Xcode 4 で新しいビューベースのプロジェクトを作成し、NSStringデフォルト値を持つ 5 つのキーを持つ「DefaultsPrefs.plist」を追加しました。AppDelegate は次のように変更されました。

 - (IBAction) savePreferences:(id)sender {
    NSUserDefaults* prefs = [NSUserDefaults standardUserDefaults];

    NSLog(@"NSUserDefaults: %@", [prefs dictionaryRepresentation]);

    [prefs synchronize];

    [[NSUserDefaults standardUserDefaults] setObject:@"UpdatedKey1Val" forKey:@"MyKey1"];
    [[NSUserDefaults standardUserDefaults] setObject:@"UpdatedKey2Val" forKey:@"MyKey2"];

    NSLog(@"NSUserDefaults: %@", [prefs dictionaryRepresentation]);
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{        
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];

    NSLog(@"MyKey1 before registerDefaults: %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"MyKey1"]); 
    NSLog(@"MyKey2 before registerDefaults: %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"MyKey2"]); 

    NSDictionary *userDefaultsDefaults = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultsPrefs" ofType:@"plist"]];

    NSLog(@"MyKey1 from userDefaultsDefaults: %@", [userDefaultsDefaults objectForKey:@"MyKey1"]); 
    NSLog(@"MyKey2 from userDefaultsDefaults: %@", [userDefaultsDefaults objectForKey:@"MyKey2"]); 

    [[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsDefaults];

    NSLog(@"MyKey1 after registerDefaults: %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"MyKey1"]); 
    NSLog(@"MyKey2 after registerDefaults: %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"MyKey2"]); 

    [self savePreferences:nil];

    return YES;
}

(から無関係なペアを取り除くNSUserDefaults)の出力で:

MyKey1 before registerDefaults: (null)
MyKey2 before registerDefaults: (null)
MyKey1 from userDefaultsDefaults: InitialMyKey1Val
MyKey2 from userDefaultsDefaults: InitialMyKey2Val
MyKey1 after registerDefaults: InitialMyKey1Val
MyKey2 after registerDefaults: InitialMyKey2Val
NSUserDefaults: {

    MyKey1 = InitialMyKey1Val;
    MyKey2 = InitialMyKey2Val;
    MyKey3 = InitialMyKey3Val;
    MyKey4 = InitialMyKey4Val;
    MyKey5 = InitialMyKey5Val;
}

NSUserDefaults: {

    MyKey1 = UpdatedKey1Val;
    MyKey2 = UpdatedKey2Val;
    MyKey3 = InitialMyKey3Val;
    MyKey4 = InitialMyKey4Val;
    MyKey5 = InitialMyKey5Val;
}

再度実行すると、出力が開始されます。

MyKey1 before registerDefaults: UpdatedKey1Val
MyKey2 before registerDefaults: UpdatedKey2Val

これは予想通りです。これは正しいように見えるので、何か間違ったことをしているに違いありません。

于 2011-03-26T03:55:50.393 に答える
0

質問が変更されたため、無関係な回答: 私の推測では、ファイル DefaultPrefs は実際にはアプリケーション バンドルに含まれていません。plist がTargetの一部であることを確認します。返されるものを確認することで、実際にバンドルに含まれているかどうかを確認できpathForResource:ofType:ます。

NSLog(@"%@", [[NSBundle mainBundle] pathForResource:@"DefaultsPrefs" ofType:@"plist"]]);

(null)これは(私の推測)またはパスのいずれかを出力します。の場合(null)、これはあなたの問題です。リソースをターゲットに追加する方法については、こちらを確認してください。

于 2011-03-26T00:30:50.260 に答える