最近,我是一名高三学生,我对制作iPhone应用程序很感兴趣。最近,我的一个应用程序问世了:NBlock。这是一款益智应用,非常具有挑战性。然而,它也有一些问题。高分不被保存。我被告知要使用列表。任何建议吗?
基于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];
我会避免使用列表。到目前为止,在应用程序中保存简单数据的最简单方法是NSUserDefaults
。
查看本教程,了解如何使用NSUserDefaults
的简单指南。当你写完信后,一定要把synchronize
和NSUserDefaults
联系起来。
如果你正在寻找一个更强大(但更复杂)的方式来保存数据,看看苹果的指南使用Core Data
。
这是你想要的:
NSArray *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
看看NSKeyedArchiver/Unarchiver。你可以保存任何你想要的东西;根据我的经验,NSUserDefaults会在你从托盘中关闭应用时转储数据。如果您正在使用sqlite等数据库管理大量数据,那么Core data的使用效果会更好。
我想说,下面的代码将工作,非常直接,除非使用自定义对象数据类型(这又是一个不同的故事):
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];
}
}
设置date属性可能有助于检查最后一次更新分数的时间。