0

我正在使用下面的方法从我的 plist 中获取一个数组,然后将某个值增加 1,然后保存它。但是,我记录了数组,并且该值实际上并没有每次都上升。

在我的 plist 中,我有一个数组,在那个数字值中,每个值都设置为 0。所以每次我再次运行它时,它似乎又回到了 0。

NSString *path = [[NSBundle mainBundle] bundlePath];
    NSString *finalPath = [path stringByAppendingPathComponent:@"Words.plist"];

    NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfFile:finalPath];
    NSMutableArray *errors = [dict objectForKey:[NSString stringWithFormat:@"Errors%d.%d", [[stageSelectionTable indexPathForSelectedRow] section] +1, [[stageSelectionTable indexPathForSelectedRow] row] +1]];

    int a = [[errors objectAtIndex:wordIndexPath] intValue];
    a += 1;
    NSNumber *b = [NSNumber numberWithInt:a];
    [errors replaceObjectAtIndex:wordIndexPath withObject:b];

    [errors writeToFile:finalPath atomically:YES];
4

2 回答 2

4

您只能写入文档文件夹中的文件。你不能写你的包!

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Namelist.plist"];

您可以使用NSFilemanager将 Plist-File 复制到文档文件夹。


要获取文件的路径:

- (NSString *)filePath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"MyFile.plist"];
    return filePath;
}

如果文件不存在,则复制该文件:

NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:[self filePath]]) {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"MyFile" ofType:@"plist"];
    [fileManager copyItemAtPath:path toPath:[self filePath] error:nil];
}

现在您可以将您NSDictionary的文件写入 Documents-Directory:

[dict writeToFile:[self filePath] atomically:YES];

但是你真的需要更新字典中的数组!

于 2012-06-15T18:12:18.113 回答
2

您正在将数组写入磁盘,而不是数组源自的字典:

[dict writeToFile:finalPath atomically:YES];

此外,您需要Errors%d.%d在保存之前将对象替换为更新的对象:

[dict setObject:errors forKey:/* your formatted key*/];

最后,正如@mavrick3 指出的那样,您不能将文件保存到您的包中,只能保存到应用程序的文档目录中。

于 2012-06-15T18:08:58.610 回答