最近,我是一名高中生,对制作iPhone应用程序很感兴趣。最近,我的一个应用程序问世了:NBlock。它是一款智力游戏,非常具有挑战性。然而,它存在一些问题。最高分数没有保存下来。有人告诉我可以使用plist文件解决这个问题。你有什么建议吗?
最近,我是一名高中生,对制作iPhone应用程序很感兴趣。最近,我的一个应用程序问世了:NBlock。它是一款智力游戏,非常具有挑战性。然而,它存在一些问题。最高分数没有保存下来。有人告诉我可以使用plist文件解决这个问题。你有什么建议吗?
通过URL的方式实现:
// Get the URL for the document directory
NSFileManager *fileManager = [[NSFileManager alloc] init];
NSURL *documentDirectoryURL = [[fileManager URLsForDocumentDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] objectAtIndex:0];
// Turn the filename into a string safe for use in a URL
NSString *safeString = [@"scores.plist" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// Create an array for the score
NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:[NSNumber numberWithInt:score]];
// Write this array to a URL
NSURL *arrayURL = [NSURL URLWithString:safeString relativeToURL:documentDirectoryURL];
[array writeToURL:arrayURL atomically:YES];
-[NSURL URLByAppendingPathComponent:]
来处理文件URL似乎更加清晰和简洁,而不是使用相对URL。这将消除路径百分比转义的需要,并且通常更少出错。 - Nikolai RuheNSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"scores.plist"];
NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:[NSNumber numberWithInt:score]];
[array writeToFile:path atomically:YES];
要添加新分数,请在声明array
时使用initWithContentsOfFile:@"scores.plist"
而不是init
。您还可以选择使用NSUserDefaults。
writeToURL:automatically:
是什么意思? - JonasG看一下NSKeyedArchiver/Unarchiver。你可以保存几乎任何想要的东西;根据我的经验,如果你从托盘中杀掉应用程序,NSUserDefaults会丢失你的数据。如果你使用像sqlite这样的数据库来管理大量数据,那么Core data会更好地被使用。
NSUserDefaults
会出现这个问题。 - mopsled我认为以下代码将有效且非常直观,除非使用自定义对象数据类型(这又是另一回事):
NSString* plistPath = nil;
NSFileManager* manager = [NSFileManager defaultManager];
if ((plistPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"PathTo.plist"]))
{
if ([manager isWritableFileAtPath:plistPath])
{
NSMutableDictionary* infoDict = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath];
[infoDict setObject:@"foo object" forKey:@"fookey"];
[infoDict writeToFile:plistPath atomically:NO];
[manager setAttributes:[NSDictionary dictionaryWithObject:[NSDate date] forKey:NSFileModificationDate] ofItemAtPath:[[NSBundle mainBundle] bundlePath] error:nil];
}
}
设置日期属性可能有助于检查上次得分更新的时间。