NSUserDefaults只保存最后一个值

时间:2015-03-20 10:25:49

标签: ios nsmutablearray nsuserdefaults nskeyedarchiver nskeyedunarchiver

如果有人可以帮助我,或者可以给我一个面对类似问题的建议,我有一个问题。好的,我在这样的NSUsersDefaults中保存数据

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:getDate];
[defaults setObject:data forKey:@"data"];
[defaults synchronize];

现在我想以这种方式检索:

NSData *theData = [[NSUserDefaults standardUserDefaults] objectForKey:@"data"];
NSString *date = (NSString *) [NSKeyedUnarchiver unarchiveObjectWithData:theData];

if (date != nil) {
    NSMutableArray *mutable = [[NSMutableArray alloc] init];
    [mutable addObject:date];
}

显示的是最后一个值,该值是从pickerDate中选取的。如何保存我从pickerDate中选择的所有日期。非常感谢!!!

4 个答案:

答案 0 :(得分:1)

我不认为这是他的问题。 NSUSerdefaults可用于存储日期 - 我已经看到它在堆栈中使用,我也使用过:

NSUserDefaults *dateData = [NSUserDefaults standardUserDefaults];
NSDate *selectedDate = [self.datePicker date];

[dateData setObject:selectedDate forKey:@"DatePickerViewController.selectedDate"];

他正在使用NSMutablearray-所以这也不是问题。 问题是两个中的一个:

1: 问题还可能是数组正在循环内初始化,并且正在删除保存在其中的先前值。

2: 我认为问题是将数据保存到数组中的代码所在的位置。 我认为一旦用户选择了一个日期,你需要调用方法将日期保存到数组中 - 问题是我不认为datepicker有一个委托方法可以知道用户已经这样做了。

有一个知道何时更改了任何一个字段:

[self.myDatePicker addTarget:self
                      action:@selector(myAction:)
            forControlEvents:UIControlEventValueChanged];

但这对你没有帮助,因为每次更改一个字段时都会调用它 - 即:一旦你改变了月份字段就会调用它,一旦你改变了日期字段就会调用,等等。

也许你可以在datepicker中加入一个完成按钮,并调用一个方法,当用户点击这个按钮时,它会将日期存储到数组中......

答案 1 :(得分:1)

问题是您未正确使用NSMutableDictionary。看看这段代码:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:getDate];
[defaults setObject:data forKey:@"data"];
[defaults synchronize];

这意味着您始终会将日期保存在密钥data下。由于您使用的是NSString,这意味着如果data下已有条目,则会覆盖它。例如:

首次使用您的应用时,保存data下无任何内容。我选择" 1-20-2015",然后我的字典是:

{data:" 1-20-2015"}

现在我去挑选另一个约会," 2015年2月21日"。我已经在数据下有一个条目,所以这意味着它将其更新为:

{data:" 2-21-2015"}

了解我们如何删除" 1-20-2015"?这就是你发生的事情。

Dictionary中,键是唯一对象。您需要使用NSMutableArray作为对象,或者为每个条目使用唯一键。

答案 2 :(得分:0)

Userdefaults不适用于数据存储。它是为了用户的喜好。不知何故,我认为"所有约会我都会从pickerDate"不是用户首选项。

您可以只存储NSDate NSNumber,而不是尝试存储@(date.timeIntervalSinceReferenceDate)。使它变得更容易。

如果你想存储多个日期 - 这就是NSArray的用途。

答案 3 :(得分:0)

我认为您以NSdate格式保存日期并在NSString中获取日期。

这样做

NSData *theData = [[NSUserDefaults standardUserDefaults] objectForKey:@"data"];
 NSDate *date =[NSKeyedUnarchiver unarchiveObjectWithData:theData];