【问题标题】:NSMutableDictionary and NSUserDefaultsNSMutableDictionary 和 NSUserDefaults
【发布时间】:2014-03-01 22:17:26
【问题描述】:

我正在尝试找出正确的数据结构来保存 'date' => 'value' 的键值

我正在尝试使用 NSMutableDictionary,因为每次用户输入一个值并按“保存”时它都必须保存。

但是,尝试 NSLog 字典的值始终为空。

- (IBAction)saveWeight:(id)sender
{
    NSMutableDictionary *weightLog = [[NSMutableDictionary alloc] init];
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    NSString *date = @"12/12/14"; 

    [weightLog setObject:self.weightInput.text forKey:date];

    NSLog(@"neweight you entered is %@", self.weightInput.text);
    NSLog(@"weightlog is %@", weightLog);

    [userDefaults setObject:weightLog forKey:@"Weightlog"];
    [userDefaults synchronize];
}

日志输出:

diet[35744:70b] neweight you entered is 13
2014-03-01 16:25:58.712 diet[35744:70b] weightlog is {
"12/12" = 13;
}

【问题讨论】:

  • 尝试打印您的 [weightLog objectForKey:@"yourkey"] 并查看打印的内容
  • 那是你的实际代码吗?显示你得到的日志文本。
  • 是的,这是我的实际代码。发生的情况是无论我输入多少个值,都只会打印出最后一个值。用日志输出编辑。

标签: ios nsuserdefaults nsmutabledictionary


【解决方案1】:

当然,只保存最后一个值,因为在添加新值之前,您不会在 weightLog 中加载以前的值!还有一件事,您应该更改每个值的键。

尝试使用这个(日期将包括年+月+日+小时+分钟+秒,所以不要每秒点击超过1次;-D):

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

NSMutableDictionary *weightLog = [NSMutableDictionary dictionaryWithDictionary:[userDefaults objectForKey:@"Weightlog"]];


NSString *date = [NSDateFormatter localizedStringFromDate:[NSDate date]
                                                dateStyle:NSDateFormatterShortStyle
                                                timeStyle:NSDateFormatterFullStyle];

[weightLog setObject:self.weightInput.text forKey:date];

NSLog(@"neweight you entered is %@", self.weightInput.text);
NSLog(@"weightlog is %@", weightLog);

[userDefaults setObject:weightLog forKey:@"Weightlog"];
[userDefaults synchronize];

【讨论】:

    【解决方案2】:

    调用:

    NSMutableDictionary *weightLog = [[NSMutableDictionary alloc] init];
    

    创建一个新的空字典,它完全忽略您之前可能存储在用户默认值中的任何内容。你应该做的是:

    NSMutableDictionary *weightLog = [[userDefaults objectForKey:@"Weightlog"] mutableCopy];
    
    if (weightLog == nil) {
        weightLog = [[NSMutableDictionary alloc] init];
    }
    

    现在weightLog 要么是可变形式的现有内容,要么是一个新的空可变字典。

    请注意,如果您总是向字典中添加相同的键,那么它将替换前一个键。因此,在您当前的代码中,您仍然只能在字典中获得 1 个条目,因为您的密钥 (date) 是硬编码的...

    【讨论】:

    • 好的,这里的最终目标是将用户“权重”变量绑定到“日期”,其中每个日期只有 1 个权重。因此,将密钥设置为当前日期应该可以工作,对吧?然后我应该能够遍历它们并显示它们对吗?
    • 是的,如果您创建今天的日期作为字典的键。然后每一天你都会覆盖前一天的那一天,但总的来说你会记录所有天的一组。
    【解决方案3】:

    上面的其他两个答案很好,并指出了您设计中的一些缺陷/误解,您总是用只有一个条目的新字典替换,是的.. 即使您修复了这个问题,您也会覆盖最后一个每次都值,因为您正在设置'object:forKey:'并始终重用相同的键...

    可变的值数组是动态、不断增长的列表的更合乎逻辑的方式。 NSNumber 也可以直接写入集合中的文件(即 NSArray、NSDictionary、NSSet),它是一种比将值硬编码为字符串更灵活、更强大且更合适的对象类型。您可以对 NSNumber 进行算术运算、比较等,也可以将 lbs 转换为 kgs 等以进行不同的本地化。

    祝你好运:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 2016-11-02
      相关资源
      最近更新 更多