Нужен совет по объединению двух списков в массив - PullRequest
0 голосов
/ 08 октября 2011

В настоящее время у меня есть tableView, который загружается из следующего массива с именем exerciseArray:

if (exerciseArray == nil)
    {
        NSString *path = [[NSBundle mainBundle]pathForResource:@"data" ofType:@"plist"];
        NSMutableArray *rootLevel = [[NSMutableArray alloc]initWithContentsOfFile:path];
        self.exerciseArray = rootLevel;
        [rootLevel release];
    }

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

Так что после того, как пользователь добавит данные, мне нужно будет объединить2 plist данные в следующий раз.Есть идеи, как это реализовать?Данные, добавленные пользователем, должны совпадать с исходной структурой списка, которая выглядит следующим образом:

enter image description here

Новый список должен содержать только ExerciseName и musclename, но мне нужнокак-то объединить два.

1 Ответ

1 голос
/ 08 октября 2011

Определяемый пользователем список свойств должен храниться в файле где-то в каталоге 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
...