我的.plist填充了我的应用附带的数据。
它基本上是一个包含其他数组/字典的字典数组。
我从这个数组中获取并在我的应用程序中使用的值可能是一个名称,因此“计算机”。
我正在添加一项功能,让用户创建自己的项目,而不是选择从数组加载的内容。但是,我应该将此项目保存到相同的.plist中,还是为每个用户创建一个单独的.plist?
然后,如何从标准.plist和用户创建的.plist中提取信息并将它们加载到一个tableView中?
答案 0 :(得分:2)
如果您正在为iOS编写,则无法真正保存到相同的plist文件,因为您无法写入应用程序包。
您可以做的一件事是将该plist的副本保存到应用程序的Documents文件夹中,然后修改相同的plist,这样您的所有数据就会统一在一个文件中。
或者,您始终可以从应用程序包中加载原始plist,制作NSArray
的可变副本,使用用户的对象从Documents文件夹加载其他plist,然后通过调用将它们附加到NSMutableArray
addObjectsFromArray
。
或者您甚至可以将它们保存在单独的NSArray
中,但通过从表格视图数据源的[originalDataArray count] + [userDataArray count]
方法返回tableView:numberOfRowsInSection:
,将它们显示在表格视图中,当然也可以使用相应的tableView:cellForRowAtIndexPath:
方法中的数据。
编辑:
关于保存用户数据,您不必担心编写一个plist
NSArray
符合NSCoding
协议,NSDictionary
也符合,这意味着您可以轻松保存并使用类似NSKeyedArchiver
类的内容加载它。
以下是我在我的旧项目中所拥有的一个示例,其中我有一个NSMutableArray
,其中包含一些用户生成的数据,我将其保存并加载NSKeyedArchiver
(简化为仅显示相关代码,并且是在一年前我刚刚开始使用ios时完成的,所以可能不是最好的方法):
- (BOOL) saveData
{
BOOL success = NO;
NSArray *pathList = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO);
NSString *path = [[[pathList objectAtIndex:0] stringByAppendingPathComponent:@"data.txt"] stringByExpandingTildeInPath];
success = [NSKeyedArchiver archiveRootObject:myArray toFile:path];
//note: myArray is an NSMutableArray, could be an NSArray
return success;
}
- (BOOL) loadData
{
BOOL success = NO;
NSArray *pathList = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO);
NSString *path = [[[pathList objectAtIndex:0] stringByAppendingPathComponent:@"data.txt"] stringByExpandingTildeInPath];
if( (myArray = [NSKeyedUnarchiver unarchiveObjectWithFile:path]) )
{
[myArray retain];
success = YES;
}
else
{
myArray = [[NSMutableArray alloc] init];
success = NO;
}
return success;
}