Обходной путь для установки значений по умолчанию перед настройкой 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;
}