所以这是我第一次尝试在iOS应用中保存数据。我已经将这个代码拼凑在这个网站上的各种答案中,以便为我正在制作的游戏保存高分。我创建了一个名为saves.plist的plist(在我的Supporting Files文件夹中),并添加了一行键@"bestScore"
并键入Number
。测试日志返回保存成功,一切正常;然而,当我去查看plist之后,似乎没有任何变化(bestScore的值为0)。我是否保存到我的代码中自动创建的另一个plist?如果是这种情况,那么能够在Xcode中创建plist的重点是什么?在这里使用的最佳实践是什么?如何创建/存储/访问plist?
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.fm = [NSFileManager defaultManager];
self.destPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];//Documents directory
self.destPath = [self.destPath stringByAppendingPathComponent:@"saves.plist"];
// If the file doesn't exist in the Documents Folder, copy it.
if (![self.fm fileExistsAtPath:self.destPath]) {
NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"saves" ofType:@"plist"];
[self.fm copyItemAtPath:sourcePath toPath:self.destPath error:nil];
}
}
- (void)saveBestScore{
NSNumber *bestScoreBox = [NSNumber numberWithUnsignedLong:self.bestScore];
NSDictionary *data = @{bestScoreBox: @"bestScore"};
BOOL successful = [data writeToFile:self.destPath atomically:YES];
successful ? NSLog(@"YES") : NSLog(@"NO");
}
答案 0 :(得分:1)
使用NSDictionary
向plist写writeToFile:
时,字典中的键和值必须遵循严格的规则。所有键都必须是NSString
个对象,所有值必须是属性值(NSString
,NSNumber
,NSDate
,NSData
等。)
您遇到的问题是,您的词典的密钥是NSNumber
,而不是NSString
。
看来你实际上是错误地创建了字典。语法是:
@{ key : value, key : value, ... }
将您的代码更改为:
NSDictionary *data = @{ @"bestScore" : bestScoreBox }; // key : value
旁注 - 你的最后一行应该是:
NSLog(@"%@", successful ? @"YES" : @"NO");
使用三元运算符运行两个不同的命令并不是一个好习惯。它意味着返回两个值中的一个。
答案 1 :(得分:1)
当你说
时当我去看看plist之后,似乎没有任何改变 (bestScore的值为0)
你的意思是在 xcode 项目文件中查看plist吗?您已将plist复制到设备目录中,因此您无法在xcode中看到更改。
如果您使用的是模拟器,则可以访问更改的plist:
~/Library/Application Support/iPhone Simulator/<Simulator Version>/Applications/<application>/Documents/
存储分数的一种简单方法是使用 NSUserDefault ,这是一个字典,如每个应用程序的持久性存储。
设置分数:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:@(score)
forKey:@"score"];
[userDefaults synchronize];
获得分数:
int score = [[[NSUserDefaults standardUserDefaults] objectForKey:@"score"] intValue];
<强>更新强>:
setInteger:forKey
和integerForKey:
因此您无需将分数包装到NSNumber中