NSUserDefaults 只保存最后一个值

NSUserDefaults is saving just last value

我有一个问题,如果有人可以帮助我或者可以给我一个遇到类似问题的人的建议。好的,我像这样将数据保存在 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 中选择的所有日期。非常感谢!!!

Userdefaults 不用于数据存储。这是为了用户的喜好。不知何故,我认为 "all dates I'm picking from pickerDate" 不是用户偏好。

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

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

我不认为这是他的问题。 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];

但这对您没有帮助,因为每次更改字段时都会调用它 - 也就是说:一旦您更改月份字段,它就会调用一次,当您更改日期字段时,等等。

)

也许您可以在日期选择器中包含一个完成按钮,并调用一个方法,在用户单击此按钮时将日期存储到数组中...

我认为你在 NSdate formate 中保存日期并在 NSString 中获取日期。

这样做

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

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

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

这意味着您将始终在 data 项下保存日期。因为您使用的是 NSString,这意味着如果 data 下已有条目,它将覆盖它。例如:

第一次使用您的应用程序时,data 下没有任何保存的内容。我选择“1-20-2015”,那么我的字典是:

{ 数据:“1-20-2015”}

现在我去选择另一个日期,“2-21-2015”。我已经在数据下有一个条目,所以这意味着它将更新为:

{ 数据:“2-21-2015”}

看看我们是如何擦除“1-20-2015”的?这就是发生在你身上的事情。

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