NSMutableDictionary和NSUserDefaults

时间:2014-03-01 22:17:27

标签: ios nsuserdefaults nsmutabledictionary

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

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

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

- (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;
}

3 个答案:

答案 0 :(得分:2)

通话:

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

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

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

if (weightLog == nil) {
    weightLog = [[NSMutableDictionary alloc] init];
}

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

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

答案 1 :(得分:2)

当然,只有最后一个valeur才会保存,因为在添加新值之前你不会在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 :(得分:1)

上面的其他两个答案都很棒,并指出你的设计中存在一些缺陷/误解,你总是用一个只有一个条目的新词典取而代之,是的......即使你修好了,你也会压倒最后一个因为你设置'object:forKey:'并且总是重复使用相同的键...

,所以每次都有价值

一个可变的值数组是一个更合理的方式来获得一个动态的,不断增长的列表。 NSNumber也可以直接写入集合中的文件(即NSArray,NSDictionary,NSSet),并且比将值硬编码到字符串中是一种更灵活,更强大和更合适的对象类型。您可以对NSNumber进行算术运算,比较等,但您也可以将lbs转换为千克等不同的地方。

祝你好运:)