NSUserDefaults不会一致加载数据

我有一个基于选项卡的应用程序,并希望每次在标签之间切换时重新加载数据 。 所以我用viewWillAppear:被调用,但数据不会重新加载。 这可能是使用了很多[NSUserDefault]的结果吗? 这是我的代码:

 -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [self reloadData]; } -(void)reloadData { //Loading all the data totalApples = [[NSUserDefaults standardUserDefaults]integerForKey:@"totalApples"]; [self setText:[NSString stringWithFormat:@"%.01f", totalApples] withExistingAttributesInLabel:self.applesLabel]; applesPerSecond = [[NSUserDefaults standardUserDefaults]integerForKey:@"applesPerSecond"]; [self setText:[NSString stringWithFormat:@"%.01f", applesPerSecond] withExistingAttributesInLabel:self.applesPerSecondLabel]; applesPerClick = [[NSUserDefaults standardUserDefaults]integerForKey:@"applesPerClick"]; } 

当使用NSUserDefaults ,在写入数据之后调用NSUserDefaults是个好主意。

以下面的例子:

 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:@100 forKey:@"SomeKey"]; [defaults synchronize]; //This will ensure data is written. 

如果您不调用此方法,系统会定期执行此操作。 但是,它可能会导致像您可能遇到的时间问题。

阅读更多关于NSUserDefaults和这里的行为。

更新

现在我想,这个问题正在失去它的背景。 以下是您在评论中发布的更新方法。 这可能是值得发布的后续问题,因为这可能不是NSUserDefaults的问题。

这里至less对于后人来说是使用NSUserDefaults写出数据的一个例子。 我也更新了你的方法来保存priceFarmHands作为float,因为正在进行乘法运算。 (它被写成一个整数之前,可能被截断)。

 - (void)buyFarmhand { farmHands++; totalApples -= priceFarmHands; if(priceFarmHands < 1000) { priceFarmHands = priceFarmHands * 1.35; } else if(priceFarmHands < 10000) { priceFarmHands = priceFarmHands * 1.25; } else { priceFarmHands = priceFarmHands * 1.15; } NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setFloat:priceFarmHands forKey:@"priceFarmHands"]; [defaults setInteger:farmHands forKey:@"farmHands"]; [defaults setDouble:totalApples forKey:@"totalApples"]; [defaults synchronize]; [self setText:[NSString stringWithFormat:@"%.f", priceFarmHands] withExistingAttributesInLabel:self priceFarmHandsLabel]; [self setText:[NSString stringWithFormat:@"%d", farmHands] withExistingAttributesInLabel:self.numberFarmhands]; } 

我没有看到你在哪里创buildNSUserdefault对象,它应该在reloadData方法中创build,这应该工作:

 -(void)reloadData { //Loading all the data NSUserDefaults *appleData = [NSUserDefaults standardUserDefaults]; totalApples = [appleData integerForKey:@"totalApples"]; applesPerSecond = [appleData integerForKey:@"applesPerSecond"]; applesPerClick = [integerForKey:@"applesPerClick"]; //Set the labels text [self setText:[NSString stringWithFormat:@"%.01f", totalApples] withExistingAttributesInLabel:self.applesLabel]; [self setText:[NSString stringWithFormat:@"%.01f", applesPerSecond] withExistingAttributesInLabel:self.applesPerSecondLabel]; } 

另外为了帮助你解决这个问题,添加一些日志到viewWillAppear

 -(void)viewWillAppear:(BOOL)animated{ NSLog(@"viewWillAppear called, reloadind data..."); [super viewWillAppear:animated]; [self reloadData]; }