2015-06-12 3 views
-1

Итак, у меня есть приложение, которое я создаю, включая контрольный список из 100 элементов.Загрузить/Сохранить NSUserDefaults Array - Bools?

Я хочу создать массив из bools, который указывает, отмечен ли элемент «отмечен», а затем сохраните его на устройстве с помощью NSUserDefaults, чтобы он мог загружаться каждый раз, когда приложение запускается.

Я понимаю, читая вокруг, что вы не можете хранить BOOL значения в NSArrays поэтому я выбрал из изменяемого массива, который держит струну @"YES" и @"NO" ... Я почти уверен, что это плохой способ сделать это, но я из идей.

Я создаю мой массив так:

boolArrayOfCheckList = [[NSMutableArray alloc] initWithCapacity:100]; 
    for (NSInteger i = 0; i < 100; i++){ 
     [boolArrayOfCheckList addObject:[NSString stringWithFormat:@"NO"]];  
    } 

Когда элемент проверяется с помощью IBAction, он обновляет массив в индекс, связанный с кнопкой (это, кажется, добавление в массив вместо того, чтобы заменить объект в указанном индекс :(...):

[boolArrayOfCheckList insertObject:[NSString stringWithFormat:@"YES"] atIndex:0]; 

Затем сохранить массив как это:

[[NSUserDefaults standardUserDefaults] setObject:boolArrayOfCheckList forKey:@"myBoolArray"]; 

Когда я перезагрузить приложение, то ViewdidLoad загружает ключ:

NSMutableArray *boolArrayOfCheckList = (NSMutableArray *)[[NSUserDefaults standardUserDefaults] objectForKey:@"myBoolArray"]; 

и сравнивая элемент, как это и загружая пункты проверки/снимите флажок соответственно:

if([[boolArrayOfCheckList objectAtIndex:0] isEqualToString:@"YES"]) ... //do this 

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

Должен быть более эффективный способ хранения контрольного списка в массиве, который может быть соответствующим образом сохранен/обновлен. Как это может быть сделано?

спасибо.

Update

Просто заметил, что я вставив вместо замены, так что объясняет массив становится все больше, вместо того, чтобы заменить объект в определенный индекс. Теперь это сделать:

[boolArrayOfCheckList replaceObjectAtIndex:1 withObject:[NSString stringWithFormat:@"YES"]]; 
+1

Лучше всего использовать 'NSNumber' обернуть' BOOL's для 'NSArray'. Однако использование массива для проверки того, был ли элемент проверен или нет, подвержен ошибкам; единственное, что связано с элементами в контрольном списке, - это их позиция в массиве. Использование словаря или добавление 'BOOL' в качестве свойства вашего элемента, вероятно, было бы лучше. – stefandouganhyde

ответ

0

Вы можете использовать NSNumber BOOL @YES и @NO вместо NSString из @ "ДА" и @ "NO".

NSDictionary *test = @{@"key" : @YES}; 

Чтобы получить значение:

BOOL keyBoolValue = [test[@"key"] boolValue]; 
NSLog(@"keyBoolValue: %i", keyBoolValue); 

if (keyBoolValue == YES) { 
    NSLog(@"true:"); 
} 
else { 
    NSLog(@"false:"); 
} 

или

if ([test[@"key"] boolValue] == YES) { ... 
+0

Как вы сравниваете их? – Reanimation

+0

'== YES' - избыточный код, вы можете удалить его. – johnpatrickmorgan

+0

Да, он избыточен и может быть удален. Здесь нужно убедиться, что пример ответа ясен. Ясность может быть добродетелью. – zaph

Смежные вопросы