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];

但是什么也没写……我的意思是,没有写pref文件。如果我强制[prefs setValue:someValue forKey:@"someKey"];,则仅使用此键/值创建文件

为什么 ?如何设置所有默认首选项然后将它们写入磁盘?

BOOL a 是。
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

由于更改了问题而回答无关紧要: 我的猜测是文件 DefaultPrefs实际上不在应用程序包中。检查 plist 是否是您的Target的一部分。您可以通过检查pathForResource:ofType:返回的内容来判断它是否真的在捆绑包中。

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

这将输出(null)(我的猜测)或路径。如果是(null),这是你的问题。在此处查看如何将资源添加到目标。

于 2011-03-26T00:30:50.260 回答
0

在复制您的代码并添加更多调试语句之后,看起来事情似乎就是您想要的样子。我在 Xcode 4 中创建了一个新的基于视图的项目,添加了一个带有 5 个带NSString默认值的键的“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 回答