Установка значения по умолчанию для комплекта не будет - PullRequest
14 голосов
/ 07 февраля 2012

У меня есть iOS-приложение с settings.bundle, которое обрабатывает различные настройки для моего приложения с помощью Switch toggle.Я установил значения по умолчанию в моем файле root.plist (используя свойство DefaultValue) на YES, но каждый раз, когда приложение запускается на устройстве или в симуляторе iOS, все значения переходят на NO.Работало хорошо только при первом запуске.

Settings Bundle PLIST

Я получаю значения по умолчанию с помощью этого кода (я что-то здесь не так делаю?):

NSUserDefaults *localeDefaults = [NSUserDefaults standardUserDefaults];
BOOL ENWORDS = [localeDefaults boolForKey:@"localetime"];

Ответы [ 5 ]

23 голосов
/ 07 февраля 2012

Значение по умолчанию используется Settings.app только для отображения.Если вы не измените значение в приложении настроек, ничего не будет сохранено в NSUserDefaults.

Вы должны зарегистрировать значения по умолчанию самостоятельно.Используйте что-то вроде этого в application:didFinishLaunchingWithOptions::

NSDictionary *userDefaultsDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
                                      [NSNumber numberWithBool:YES], @"localetime",
                                      nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsDefaults];
21 голосов
/ 07 февраля 2012

Этот пост в блоге может помочь: http://greghaygood.com/2009/03/09/updating-nsuserdefaults-from-settingsbundle

tl; dr - пока пользователь не откроет страницу настроек, настройки по умолчанию не будут скопированы в ваше приложение. Это ожидаемое поведение Apple.

Лично я думаю, что это ужасно. Это означает, что вам придется устанавливать значения по умолчанию в коде на тот случай, если пользователь запустит ваше приложение, не перейдя сначала на страницу настроек (что будет справедливо для примерно 99% случаев использования!)

15 голосов
/ 08 февраля 2012

Проблема в том, что тип default Value должен быть boolean, а не string;) удалить это значение и снова добавить еще одно свойство default Value надеюсь, это поможет

4 голосов
/ 18 февраля 2016
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //< Register Defaults
    NSString *settingsBundlePath = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"];
    NSBundle *settingsBundle = [NSBundle bundleWithPath:settingsBundlePath];
    NSString *rootPlistPath = [settingsBundle pathForResource:@"Root" ofType:@"plist"];
    NSDictionary *settingsDict = [[NSDictionary alloc] initWithContentsOfFile:rootPlistPath];
    NSArray *settingsItems = [settingsDict objectForKey:@"PreferenceSpecifiers"];
    NSMutableDictionary *defaultDict = [NSMutableDictionary new];
    for (NSDictionary *itemDict in settingsItems) {
        if ([itemDict objectForKey:@"DefaultValue"]) {
            [defaultDict setObject:[itemDict objectForKey:@"DefaultValue"] forKey:[itemDict objectForKey:@"Key"]];
        }
    }
    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultDict];
    //< Following Code
}
1 голос
/ 09 марта 2013

Вы можете проверить, было ли установлено значение, получив objectForKey и проверив, имеет ли оно значение nil.

   NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
   id dataExists = [userDefaults objectForKey:@"light_switch"];
   BOOL lightSwitch;
   if (dataExists != nil) {
      lightSwitch = [userDefaults boolForKey:@"light_switch"];
       NSLog(@"light_switch is %d", validateCertificates);
   } else {
      lightSwitch = YES; // default value
      NSLog(@"light_switch not set, default value is %d", validateCertificates);
   }
...