所以我是Obj-C的新手(具有C和C ++经验)并且我一直在努力。
很简单,我想保存并加载用户进度时的得分和等级
我有3个函数,getFilePath
,loadData
和savaData
。
我的getFilePath
和loadData
似乎工作正常,但我无法让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
消息返回正确的值,用户进展级别,但我无法保存它们。
答案 0 :(得分:7)
问题是getFilePath
方法正在使用NSDocumentationDirectory
而不是NSDocumentDirectory
。不幸的是,Xcode的自动完成逻辑很容易选错。
另外两个建议:
您应该检查writeTofile
的结果,或许类似于:
NSArray *array1 = @[@1, @5, @3.423];
BOOL success = [array1 writeToFile:path atomically:YES];
NSAssert(success, @"%s: write failed", __FUNCTION__);
就个人而言,由于我经常使用此模式创建一个引用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:指定只能将NSString
,NSData
,NSArray
或NSDictionary
类型写入文件。
要将NSNumber
数据写入文件,请查看其他序列化方法,例如:NSKeyedArchiver,NSPropertyListSerialization或NSJSONSerialization