【问题标题】:UIStepper - Set value from NSUserDefaultsUIStepper - 从 NSUserDefaults 设置值
【发布时间】:2013-12-19 15:11:45
【问题描述】:

下面的代码使用步进器来设置 myLabel 的值。 我已将其设置为将值存储到 NSUserDefaults。

1) 我还需要将步进值设置为与我放入标签的值相同的数字。有人可以建议如何做到这一点吗? (我在代码中添加了一条我认为应该是这样的注释。)

2)我还想在加载 saveString 之前检查它是否实际设置,如果没有,请设置默认值。您能否建议如何实现这一目标?

谢谢。

- (void)viewWillAppear:(BOOL)animated
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *loadString = [defaults objectForKey:@"saveString"];
    self.myLabel.text = loadString;
// Need to set the stepper value to that in loadString
}

- (IBAction)stepChanged:(id)sender {
    NSString *saveString = [NSString stringWithFormat:@"%d",
                            [[NSNumber numberWithDouble:[(UIStepper *)sender value]] intValue]];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:saveString forKey:@"saveString"];
    [defaults synchronize];
    self.myLabel.text = saveString;
}

我已将代码更新如下:-

- (void)viewWillAppear:(BOOL)animated
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSNumber *loadNumber = [defaults objectForKey:@"saveNumber"];
    self.myLabel.text = [NSString stringWithFormat:@"%@",loadNumber];
    UIStepper *stepper = [[UIStepper alloc] init];
    stepper.value = [NSNumber numberWithDouble:loadNumber];
}

- (IBAction)stepChanged:(id)sender {
    NSNumber *saveNumber = [NSNumber numberWithDouble:[(UIStepper *)sender value]];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:saveNumber forKey:@"saveNumber"];
    [defaults synchronize];
    self.myLabel.text = [NSString stringWithFormat:@"%@",saveNumber];
}

但是,行 'stepper.value = [NSNumber numberWithDouble:loadNumber];'错误'将'NSNumber *__strong'发送到不兼容类型'double''的参数。我认为步进器只会接受一个double,但我不确定我做错了什么来设置它。

我需要实现以下目标:- 1) 在 NSUserDefaults 中为 saveNumber 设置一个默认值,在用户做出更改之前将一直使用该默认值。 2) 在加载或视图出现时,使用 saveNumber 设置 stepper.value 和 myLabel 的值。 3) 确保当使用步进器更改时,myLabel 中的值会更新,并且 NSUserDefaults saveNumber 也会更新。

谁能告诉我哪里出错了,请帮助纠正我的代码?

此外,我在键入此内容时刚刚意识到的是,在最终的应用程序中,我将在不同的 viewController 上进行此设置,而不是使用 NSUserDefaults savedNumber 值的那个。考虑到这一点,您能否告诉我如何确保 savedNumber 不仅适用于这个 viewController,而且适用于我需要这些值的任何其他视图控制器?

非常感谢。

【问题讨论】:

  • stepper.value = '[loadNumber doubleValue];'应该做的伎俩。 NSUserDefaults 在所有其他视图控制器中也可用,因为信息保存在本地文件系统中。就像现在一样在另一个视图控制器中获取您的信息。
  • @dehlen 请查看stackoverflow.com/questions/20708074/…。正如你所说的,我已经得到了那套,但仍然有问题。

标签: ios nsuserdefaults uistepper


【解决方案1】:

关于问题 1: 只需创建一个实例变量int stepper;(在您的.h 中) 然后在viewWillAppear 中像现在一样设置这个变量;并设置

stepper = [defaults integerForKey:@"stepper"];

在您的 IBAction 中调用

stepper++;
self.myLabel.text = [NSString stringWithFormat:@"%i",stepper];
and save it in your NSUserDefaults.

关于问题 2:NSUserDefaults 提供了为某些键注册默认值的可能性,看看这个:

NSDictionary *defaults = [NSDictionary dictionaryWithObjectsAndKeys:
                                @"test", @"key",
                                nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaults];

【讨论】:

  • 参见 - (IBAction)stepChanged:(id)sender 设置 NSUserDefaults 并在更改时更新标签。
  • 谢谢你。我不完全确定如何完成这项工作,并在我的问题中添加了修改代码。有意见吗?!
  • 谢谢。我只是将 registerDefaults 转移到 viewController.m 文件中,它就起作用了。所以回头查看 appDelegate.m 并意识到我已将两行放在 return YES 语句之后,因此它从未被调用过。谢谢。
【解决方案2】:

如果 NSUserDefaults 中没有设置任何内容,objectForKey 方法将返回 nil,因此您的 loadString 将是 nil

现在,您可以将保存的字符串值转换为数字,例如 [loadString floatValue];,但可能更好的方法是将具有正确值的 NSNumber 存储到 userDefaults 中,然后重新创建使用stringWithFormat 方法的标签文本。

【讨论】:

  • 谢谢你。我不完全确定如何完成这项工作,并在我的问题中添加了修改代码。有意见吗?!
  • 该行应该是 stepper.value = [loadNumber doubleValue];
  • 请看stackoverflow.com/questions/20708074/…。我现在已经得到了那个设置,但仍然有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
相关资源
最近更新 更多