Установка значения по умолчанию для пула

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

Settings Bundle PLIST

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

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

Ответы

Ответ 1

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

Ответ 2

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

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

NSDictionary *userDefaultsDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
                                      [NSNumber numberWithBool:YES], @"localetime",
                                      nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsDefaults];

Ответ 3

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

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

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

Ответ 4

- (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
}

Ответ 5

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

   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);
   }