Нужна помощь в создании .plist в приложении - PullRequest
2 голосов
/ 22 июля 2011

Мое приложение поставляется с .plist, который выглядит следующим образом:

enter image description here

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

ИтакМне нужно создать новый .plist в папке с документами пользователя, который имитирует этот формат.Кто-нибудь может мне помочь с этим?

Мне нужно что-то вроде этого (псевдокод)

if (userData == nil)
{
     then create the .plist file;
     setup the .plist to mimic the format of the img above.
} 
now save exerciseName appropriately.

Обновление:

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

Ответы [ 2 ]

1 голос
/ 22 июля 2011

Что вам нужно сделать, это загрузить Plist в NSDictionary и закодировать этот NSDictionary обратно в файл Plist в папке документов вашего приложения.В вашем applicationDidFinishLoading: метод, я бы сделал что-то вроде этого:

NSString * documentFile = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/myPlist.plist"];
if (![[NSFileManager defaultManager] fileExistsAtPath:documentFile]) {
    // create a copy of our resource
    NSString * resPath = [[NSBundle mainBundle] pathForResource:@"myPlist" ofType:@"plist"];
    // NOTE: replace @"myPlist" with the name of the file in your Resources folder.
    NSDictionary * dictionary = [[NSDictionary alloc] initWithContentsOfFile:resPath];
    [dictionary writeToFile:documentFile atomically:YES];
    [dictionary release];
}

Затем, когда вы хотите добавить элемент, вы хотите использовать NSMutableDictionary для изменения и сохранения существующего списка в каталоге документов приложения:

- (void)addExercise {
    NSMutableDictionary * changeMe = [[NSMutableDictionary alloc] initWithContentsOfFile:documentFile];
    ... make changes ...
    [changeMe writeToFile:documentFile atomically:YES];
    [changeMe release];
}

Чтобы внести изменения, вам необходимо найти под-словарь, содержащий массив упражнений.Затем используйте setObject: forKey: метод в NSMutableDictionary, чтобы установить новый массив, содержащий новый список упражнений.Это может выглядеть примерно так:

NSMutableArray * list = [NSMutableArray arrayWithArray:[changeMe objectForKey:@"list"]];
NSArray * exercises = [[list objectAtIndex:10] objectForKey:@"exercises"];
NSDictionary * newExercise = [NSDictionary dictionaryWithObject:@"Type a LOT" forKey:@"exerciseName"];
exercises = [exercises arrayByAddingObject:newExercise];
NSMutableDictionary * dict = [NSMutableDictionary dictionaryWithDictionary:[list objectAtIndex:10]];
[dict setObject:exercises forKey:@"exercises"];
[list replaceObjectAtIndex:10 withObject:dict];
[changeMe setObject:list forKey:@"list"];

После внесения изменений важно не забывать записывать changeMe в plist-файл в каталоге документов.

1 голос
/ 22 июля 2011

Самый простой способ чтения и записи списков свойств - это использовать классы NSArray или NSDictionary. Ваш скриншот выглядит как массив на верхнем уровне, поэтому я буду использовать это предположение для моих примеров.

Сначала вам понадобятся пути к файлу пользователя и исходному файлу.

NSString *pathToUserFile; // Get a path to the file in the documents directory
NSString *pathToDefaultFile; // Get a path to the original file in the application bundle

Затем вы пытаетесь загрузить

NSMutableArray *userData;
NSArray *temporary = [NSArray arrayWithContentsOfFile:pathToUserFile];
if(!temporary) temporary = [NSArray arrayWithContentsOfFile:pathToDefaultFile];

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

userData = (NSMutableArray *)CFPropertyListCreateDeepCopy(NULL,(CFArrayRef)temporary,kCFPropertyListMutableContainers);

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

[userData addObject:newDataObject];

Наконец, вы записываете данные в файл в каталоге документов. Метод writeToFile:atomically: попытается выписать список свойств и вернет YES в случае успеха. Он потерпит неудачу и вернет NO, если файл не может быть записан, или если содержимое не является всеми допустимыми объектами списка свойств.

if(![userData writeToFile:pathToUserFile atomically:YES]) {
    NSLog(@"Error writing to file");
}
...