iPhone - зарегистрированные префы по умолчанию не записываются в файл plist - PullRequest
0 голосов
/ 26 марта 2011

У меня есть этот (намного более простой) код в моем приложении 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 is YES.
NSLog возвращает все содержимое файла DefaultPrefs, а также некоторые системные значения, такие как:

AppleICUForce24HourTime = 1; 
AppleKeyboardsExpanded = 1;

Ответы [ 3 ]

2 голосов
/ 26 марта 2011

Как установить все настройки по умолчанию и записать их на диск?

почему? То, что на диск ничего не записано, - все дело в значениях по умолчанию. Они являются значениями по умолчанию, они не устанавливаются пользователем и могут быть изменены в более поздней версии вашей программы.
Не желательно, чтобы они сохранялись в файле настроек. После их сохранения вы не сможете различить предпочтения, которые были изменены пользователем, и значения по умолчанию, и, следовательно, вы не сможете заменить их новыми значениями по умолчанию.

Это ведет себя точно так же, как и должно.

Если вы хотите записать в файл настроек, используйте [[NSUserDefaults standardUserDefaults] setObject:foo forKey:bar]

Я полагаю, вы можете использовать цикл for, если хотите.

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

Но вы должны пересмотреть, если вам действительно нужно сохранить эти значения по умолчанию. Я не могу придумать вескую причину сделать это.

0 голосов
/ 26 марта 2011

После дублирования вашего кода и добавления дополнительных операторов отладки все выглядит так, как вы хотите. Я создал новый проект на основе View в Xcode 4, добавил «DefaultsPrefs.plist» с 5 ключами с / 1001 * значениями по умолчанию, и мой 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

Это как и ожидалось. Вы должны делать что-то еще неправильно, потому что это кажется правильным.

0 голосов
/ 26 марта 2011

Ответ не имеет значения из-за измененного вопроса: Я предполагаю, что файл DefaultPrefs не на самом деле в комплекте приложений.Убедитесь, что plist является частью вашей Target .Вы сможете узнать, действительно ли он находится в комплекте, проверив, что возвращает pathForResource:ofType:.

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

Это выдаст либо (null) (мое предположение), либо путь,Если это (null), это ваша проблема.Проверьте здесь , чтобы узнать, как добавить ресурс к цели.

...