【问题标题】:NSUserDefaults work different on Iphone and SimulatorNSUserDefaults 在 Iphone 和 Simulator 上的工作方式不同
【发布时间】:2012-08-14 23:44:09
【问题描述】:

我正在使用 NSUserDefaults 在另一个视图控制器上保存一个整数,以便在推送这个时我知道要使用哪个图像。出于某种原因,模拟器只使用 image1 而我的手机只使用 image2。我能做什么?

if ([[NSUserDefaults standardUserDefaults] integerForKey:@"key"] == 1){

    leftStill = [UIImage imageNamed:@"image1.png"];

}

if ([[NSUserDefaults standardUserDefaults] integerForKey:@"key"] == 2) {

    leftStill = [UIImage imageNamed:@"image2.png"];

}

[imageView setImage:leftStill];

【问题讨论】:

  • 您的代码告诉您,在模拟器上键的值为 1,而在设备上为 2。您的代码中可能存在设置这些键的错误,但您没有发布,所以我们怎么知道?
  • 当我使用 NSLog 检查时,整数没有正确输出,它只有图像
  • 这没有意义。其他事情正在发生。例如“image1.png”和“image2.png”在某种程度上不是你想象的那样。您可以通过在分配给leftStill 之前输入NSLog 来验证这一点。

标签: objective-c ios cocoa-touch nsuserdefaults


【解决方案1】:

在 NSUserDefaults 中设置值后,您是否调用了- (BOOL)synchronize;

【讨论】:

  • 阅读有关 NSUerDefaults 的文档。习惯阅读它们,使其成为第二天性。你会在那里找到答案。
【解决方案2】:

你是从这个代码块之前的 nil/未分配的 leftImage 和 imageView 开始的吗?

由于您正在测试一个整数值,我想知道以下代码是否可能对您来说效果不佳,可能不仅避免了您的代码当前正在执行的值的两次读取,这可能是问题的原因,还可以使用中介持有人leftImage本身:

switch([[NSUserDefaults standardUserDefaults] integerForKey:@"key"]) {
  case 1:
    [imageView setImage:[UIImage imageNamed:@"image1.png"];
    break;
  case 2:
    [imageView setImage:[UIImage imageNamed:@"image2.png"];
    break;
  default:
    break;
}

【讨论】:

    【解决方案3】:

    当您将值存储在 NSUserDefaults 中时,您会执行以下操作:

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setInteger:1 forKey:@"key"];
    [defaults synchronize];
    

    同步确实会定期发生,但您无法保证何时会发生。因此,我通常在为 NSUserDefaults 中的键设置值时进行同步。

    您可能还想考虑一些更适合您尝试完成的任务的方法,例如使用 prepareForSegue。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 2012-06-04
      • 2011-01-29
      • 1970-01-01
      • 2018-12-11
      相关资源
      最近更新 更多