保存成功但不可见编辑plist

时间:2014-03-22 03:13:23

标签: ios objective-c plist

所以这是我第一次尝试在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");
}

2 个答案:

答案 0 :(得分:1)

使用NSDictionary向plist写writeToFile:时,字典中的键和值必须遵循严格的规则。所有键都必须是NSString个对象,所有值必须是属性值(NSStringNSNumberNSDateNSData等。)

您遇到的问题是,您的词典的密钥是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];

<强>更新

rmaddy提到 NSUserDefaults 支持setInteger:forKeyintegerForKey:因此您无需将分数包装到NSNumber中