iPhone - чтение Setting.bundle возвращает неправильные значения - PullRequest
8 голосов
/ 30 марта 2011

Я создал файл Settings.bundle, который поставляется с файлом Root.plist и каталогом локализации en.lproj.

Я отредактировал Root.plist и добавил несколько настроек, которые я хочу установить для своего приложения.

Когда я удаляю приложение с iPhone, устанавливаю его и запускаю в первый раз, все прочитанные настройки возвращают неправильные значения. Например:

highQualityFlag = [[[NSUserDefaults standardUserDefaults] stringForKey:@"qualityFlag"] boolValue];

флаг устанавливается как НЕТ, даже если значение по умолчанию - ДА.

Если я что-то изменил в настройках и запустил снова, все последующие прогоны дают мне правильные значения (??)

Как мне это решить?

спасибо

1 Ответ

24 голосов
/ 31 марта 2011

Попробуйте это:

- (void)registerDefaultsFromSettingsBundle 
{
    NSString *settingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"];
    if(!settingsBundle) 
    {
        //NSLog(@"Could not find Settings.bundle");
        return;
    }

    NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"Root.plist"]];
    NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"];

    NSMutableDictionary *defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]];
    for(NSDictionary *prefSpecification in preferences) 
    {
        NSString *key = [prefSpecification objectForKey:@"Key"];
        if(key) 
        {
            [defaultsToRegister setObject:[prefSpecification objectForKey:@"DefaultValue"] forKey:key];
        }
    }

    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultsToRegister];
    [defaultsToRegister release];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{    
    [self registerDefaultsFromSettingsBundle];

    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        [window makeKeyAndVisible];
    return YES;
}
...