我的应用程序附带了一个如下所示的.plist:
我希望用户能够添加自定义exerciseName。
所以我需要在模仿这种格式的用户文档文件夹中创建一个新的.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];
}
答案 0 :(得分:1)
读取和写入属性列表的最简单方法是使用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");
}
答案 1 :(得分:1)
您要做的是将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修改并保存应用程序文档目录中的现有plist:
- (void)addExercise {
NSMutableDictionary * changeMe = [[NSMutableDictionary alloc] initWithContentsOfFile:documentFile];
... make changes ...
[changeMe writeToFile:documentFile atomically:YES];
[changeMe release];
}
要进行更改,您需要找到包含练习数组的子词典。然后使用NSMutableDictionary上的setObject:forKey:方法设置一个包含新练习列表的新数组。这可能看起来像这样:
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文件。