Обходной путь для установки значений по умолчанию перед настройкой settings.bundle

(Я новичок в IOS и Objective-C, поэтому прошу прощения за любое неправильное использование терминологии...) В моем приложении я решил использовать файл settings.bundle для хранения настроек своего приложения, но когда приложение впервые установлено и до пользователь переходит к настройкам на своем устройстве IOS, он не загружает значения по умолчанию. Я прочитал много постов, объясняющих, что приложение должно создавать свои собственные значения по умолчанию, пока файл settings.bundle не был "инициализирован".

Для этого я написал некоторый код, который читает в файле settings.bundle и создает соответствующий массив. Но если settings.bundle не был инициализирован, он создает массив по умолчанию для временного использования. Я подозреваю, что моя проблема со следующей строкой кода, где я использую логический оператор AND (возможно, неправильно...):

if (!([swimtypeendurance isEqualToString:@"ON"]) && !([swimtypeendurance isEqualToString:@"OFF"]))

Проблема в том, что я не могу получить истинный результат для оператора if выше, мое приложение всегда выполняет "else". Насколько я понимаю, файл settings.bundle состоит в том, что если они не были инициализированы, то переключатель не включен или не выключен, как если бы он не имел значения. Поэтому я проверяю, не является ли строка для типа плавания выносливой или нет, другими словами, если она не включена и не выключена - отсюда моя попытка использовать! а также &&...

Возможно, лучший способ объяснить, что я делаю, это: я проверяю значение одной из моих настроек в файле settings.bundle, чтобы увидеть, включена она или выключена. Если это одно из двух состояний, то я предполагаю, что пакет настроек был инициализирован и все настройки могут использоваться, если нет, то есть он не имеет состояния, тогда я создаю массив, который будет использоваться, пока пользователь не выполнит инициализацию settings.bundle.

Вот полный фрагмент кода для обеспечения контекста вопроса:

NSMutableArray* arrayofswimtypes = [NSMutableArray arrayWithCapacity:15];
    NSString *swimtt750 = [defaults boolForKey:kswimtypett750mKey]? @"ON" : @"OFF";
    if ([swimtt750 isEqualToString:@"ON"]) {
        swimTypeTt750m = [[NSString alloc] initWithFormat:@"Time Trial - 750m"];
        [arrayofswimtypes addObject:[[NSString alloc] initWithFormat:@"%@", swimTypeTt750m]];
    }
    NSString *swimtt1500 = [defaults boolForKey:kswimtypett1500mKey]? @"ON" : @"OFF";
    if ([swimtt1500 isEqualToString:@"ON"]) {
        swimTypeTt1500m = [[NSString alloc] initWithFormat:@"Time Trial - 1500m"];
        [arrayofswimtypes addObject:[[NSString alloc] initWithFormat:@"%@", swimTypeTt1500m]];
    }

    [arrayofswimtypes addObject:[[NSString alloc] initWithFormat:@"General Session"]];

    NSString *swimtypedrills = [defaults boolForKey:kswimtypedrillsKey]? @"ON" : @"OFF";
    if ([swimtypedrills isEqualToString:@"ON"]) {
        swimTypeDrills = [[NSString alloc] initWithFormat:@"Drills Session"];
        [arrayofswimtypes addObject:[[NSString alloc] initWithFormat:@"%@", swimTypeDrills]];
    }
    NSString *swimtypeendurance = [defaults boolForKey:kswimtypeenduranceKey]? @"ON" : @"OFF";
    if ([swimtypeendurance isEqualToString:@"ON"]) {
        swimTypeEndurance = [[NSString alloc] initWithFormat:@"Endurance Session"];
        [arrayofswimtypes addObject:[[NSString alloc] initWithFormat:@"%@", swimTypeEndurance]];
    }

    //Place an if-else statement in here to load a default array if the user has not been to settings and initialised the settings.bundle
    if (!([swimtypeendurance isEqualToString:@"ON"]) && !([swimtypeendurance isEqualToString:@"OFF"])) {
        swimSessTypesArray = [[NSMutableArray alloc] initWithObjects:[[NSString alloc] initWithFormat:@"Time Trial - 750m"],
                              [[NSString alloc] initWithFormat:@"Time Trial - 1500m"], 
                              [[NSString alloc] initWithFormat:@"General Session"],
                              [[NSString alloc] initWithFormat:@"Drills Session"],
                              [[NSString alloc] initWithFormat:@"Endurance Session"], nil];
        NSLog(@"Count of swimSessTypesArray NOT FROM Defaults: %i", [swimSessTypesArray count]);
    } else {
        swimSessTypesArray = arrayofswimtypes;
        NSLog(@"Count of swimSessTypesArray from Defaults: %i", [swimSessTypesArray count]);
    }

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

Заранее большое спасибо за вашу помощь...

1 ответ

Решение

Хорошо, комментарий от Матиаса привел меня к моему рабочему решению. По сути, есть два распространенных метода для тестирования, если settings.bundle для вашего приложения был инициализирован пользователем и установлены значения по умолчанию для использования, если нет: 1) использовать registerDefaults и 2) создавать свои собственные тесты, используя некоторые операторы IF-ELSE. Поскольку вопрос связан с последним из двух вариантов, я отвечу на него, а не на метод registerDefaults.

Первое, что нужно знать, это то, что boolForKey будет возвращать NO при 2 различных условиях: во-первых, когда ключ не существует (эффективно, когда пакет настроек не был инициализирован пользователем) и когда он установлен в положение no of OFF. Это делает очень невозможным тестирование с использованием boolForKey, но если вы используете objectForKey для проверки, существует ли ключ, то он работает отлично. Код выглядит следующим образом (в соответствии с примером кода из вопроса):

if (![boolForKey:kswimtypeednurancekey]) {
Create your default settings to be used by the app;
} else {
Use the settings from the settings.bundle;
}
Другие вопросы по тегам