我正在尝试找出正确的数据结构来保存'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;
}
答案 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转换为千克等不同的地方。
祝你好运:)