Определяемый пользователем список свойств должен храниться в файле где-то в каталоге Documents . Обычно для чего-то подобного я бы предложил создать копию Plist по умолчанию, которая поставляется вместе с приложением, в каталог Documents , а затем изменить и загрузить этот файл по мере необходимости. Копировать ресурс в каталог документов можно следующим образом:
NSString * documentsPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
NSString * docPlist = [documentsPath stringByAppendingPathComponent:@"data.plist"];
if (![[NSFileManager defaultManager] fileExistsAtPath:docPlist]) {
NSString * resPlist = [[NSBundle mainBundle]pathForResource:@"data" ofType:@"plist"];
[[NSFileManager] defaultManager] copyItemAtPath:resPlist
toPath:docPlist
error:nil];
}
NSMutableArray * root = [[NSMutableArray alloc] initWithContentsOfFile:docPlist];
Приведенный выше код просто находит путь к списку в каталоге документов и проверяет, существует ли он. Если это не так, он копирует ресурс data.plist в каталог документов. После этого он загружает корневой элемент в изменяемый массив, который затем можно использовать и изменять с помощью стандартных методов addObject:
и removeObject:
.
Наконец, для сохранения любых измененных данных , просто запишите массив root
обратно в файл plist следующим образом:
[root writeToFile:docPlist atomically:YES];
Единственная проблема, связанная с этим, заключается в том, что в процессе разработки приложения вы можете захотеть изменить или модифицировать некоторые данные в ресурсе data.plist . Чтобы приложение скопировало этот недавно измененный список свойств в каталог documents , вам необходимо полностью удалить его из iOS Simulator, затем заново скомпилировать и запустить.
Редактировать : Чтобы добавить упражнение к существующей мышце, просто сделайте что-то вроде этого:
// find the exercise dictionary
int muscleIndex = 0;
NSMutableDictionary * muscleDict = nil;
NSString * muscleName = @"Neck";
NSString * exerciseName = @"Nod your head a billion times";
// find the right muscle
for (int i = 0; i < [root count]; i++) {
NSDictionary * muscle = [root objectAtIndex:i];
if ([[muscle objectForKey:@"muscleName"] isEqualToString:muscleName]) {
muscleIndex = i;
muscleDict = [NSMutableDictionary dictionaryWithDictionary:muscle];
}
}
NSMutableArray * exercises = [NSMutableArray arrayWithArray:[muscleDict objectForKey:@"exercises"]];
[exercises addObject:exerciseName];
[muscleDict setObject:exercises forKey:@"exercises"];
[root replaceObjectAtIndex:muscleIndex withObject:muscleDict];
...
// save root here