目前,我有一个tableView,它从以下名为exerciseArray
的数组中加载:
if (exerciseArray == nil)
{
NSString *path = [[NSBundle mainBundle]pathForResource:@"data" ofType:@"plist"];
NSMutableArray *rootLevel = [[NSMutableArray alloc]initWithContentsOfFile:path];
self.exerciseArray = rootLevel;
[rootLevel release];
}
但是,我想要一个选项让用户添加自己的数据,这些数据需要在同一个表视图中显示。我可以将这些数据添加到原始plist中,但我认为最好创建一个单独的plist,让用户添加数据。
因此,在用户添加数据之后,我将需要下次合并2个plist数据。知道如何实现这个吗?用户添加的数据需要与原始的plist结构匹配,如下所示:
新的plist应该只有ExerciseName
和musclename
,但我需要以某种方式将两者合并。
答案 0 :(得分:1)
用户定义的属性列表应存储在 Documents 目录中的某个文件中。通常,对于这样的事情,我建议创建应用程序附带到 Documents 目录的默认Plist的副本,然后根据需要修改和加载此文件。将资源复制到文档目录可以按如下方式完成:
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];
上面的代码只是找到文档目录中plist的路径,并检查它是否存在。如果没有,则将 data.plist 资源复制到文档目录。完成此操作后,它会将根元素加载到可变数组中,然后您可以使用标准addObject:
和removeObject:
方法进行修改。
最后,保存任何已修改的数据,只需将root
数组写回plist文件,如下所示:
[root writeToFile:docPlist atomically:YES];
唯一的解决方案是,在开发应用程序的过程中,您可能希望更改或修改 data.plist 资源中的某些数据。为了让应用程序将这个新修改的属性列表复制到文档目录,您需要从iOS模拟器中完全卸载它,然后重新编译并运行。
编辑:为了为现有肌肉添加练习,只需执行以下操作:
// 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