有关于保存到plist的问题

时间:2011-07-21 22:19:41

标签: iphone objective-c xcode uitableview nsarray

我的.plist填充了我的应用附带的数据。

它基本上是一个包含其他数组/字典的字典数组。

我从这个数组中获取并在我的应用程序中使用的值可能是一个名称,因此“计算机”。

我正在添加一项功能,让用户创建自己的项目,而不是选择从数组加载的内容。但是,我应该将此项目保存到相同的.plist中,还是为每个用户创建一个单独的.plist?

然后,如何从标准.plist和用户创建的.plist中提取信息并将它们加载到一个tableView中?

1 个答案:

答案 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;
}