将NSNumber保存在plist中,而不是工作

时间:2013-12-02 08:31:32

标签: ios objective-c plist nsnumber

所以我是Obj-C的新手(具有C和C ++经验)并且我一直在努力。
很简单,我想保存并加载用户进度时的得分和等级 我有3个函数,getFilePathloadDatasavaData

我的getFilePathloadData似乎工作正常,但我无法让saveData工作。

这是我的代码:

 -(void)saveData
 {
    NSNumber *updatedScore = [NSNumber numberWithInt:score];
    NSNumber *updatedLevel = [NSNumber numberWithInt:level];
    NSLog(@"The level im saving is %@",updatedLevel);
    NSLog(@"The score im saving is %@",updatedScore);
    NSMutableArray *value = [[NSMutableArray alloc]initWithObjects:updatedLevel,updatedScore, nil];
    [value writeToFile:[self getFilePath] atomically:YES];
}

-(NSString *)getFilePath
{
    NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
    NSLog(@"the path is %@",pathArray);
    return [[pathArray objectAtIndex:0]stringByAppendingPathComponent:@"saved.plist"];
}

我的NSLog消息返回正确的值,用户进展级别,但我无法保存它们。

2 个答案:

答案 0 :(得分:7)

问题是getFilePath方法正在使用NSDocumentationDirectory而不是NSDocumentDirectory。不幸的是,Xcode的自动完成逻辑很容易选错。


另外两个建议:

  1. 您应该检查writeTofile的结果,或许类似于:

    NSArray *array1 = @[@1, @5, @3.423];
    BOOL success = [array1 writeToFile:path atomically:YES];
    NSAssert(success, @"%s: write failed", __FUNCTION__);
    
  2. 就个人而言,由于我经常使用此模式创建一个引用NSDocumentDirectory目录中文件路径的字符串,因此我为其创建了一个代码片段,这使我无法输入错误的机会。它为我提供了几行代码的“自动完成”功能。所以,假设我的代码中有以下两行:

    NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *path          = [documentsPath stringByAppendingString:<#filename#>];
    

    显然,使用您想要的任何代码,但关键是使用<#filename#>占位符作为参数stringByAppendingString。然后,如Creating a Custom Code Snippet文档中所述(或参见NSHipster的discussion on the topic),您可以将这两行代码拖到代码段库中,为它提供一个好名字(同样重要的是,这是一个很好的快捷方式,我使用“documentsPath”作为我的快捷方式。现在,在将来,我可以在我的代码中开始输入“documentsPath”,并且系统会提示我这两行代码。

    由于我已经开始使用这个特定的代码段,我从来没有错误地意外地抓取错误的值而不是NSDocumentDirectory

答案 1 :(得分:1)

documentation for writeToFile:atomically:指定只能将NSStringNSDataNSArrayNSDictionary类型写入文件。

要将NSNumber数据写入文件,请查看其他序列化方法,例如:NSKeyedArchiverNSPropertyListSerializationNSJSONSerialization