【问题标题】:NSUserDefaults is saving just last valueNSUserDefaults 只保存最后一个值
【发布时间】:2015-03-20 10:25:49
【问题描述】:

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

【问题讨论】:

  • getDate 的类型是什么?
  • 你应该把整个历史记录(=dates)放在NSMutableArray,你应该把它保存到Documents文件夹中;之后你可以恢复它、扩展它、删除它……或者任何你梦寐以求的东西。
  • getDate 是 NSString 的类型
  • 是的,我将所有历史记录都放在了 NSMutableArray 中,但只存储了我选择的最后一个值.....

标签: ios nsmutablearray nsuserdefaults nskeyedarchiver nskeyedunarchiver


【解决方案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”,然后我的字典是:

{ 数据:“2015 年 1 月 20 日”}

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

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

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

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

【讨论】:

  • 非常感谢你是对的,正在工作,但我以不同的方式解决了这个问题。我会尽快发布答案。
【解决方案2】:

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

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

)

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

【讨论】:

【解决方案3】:

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

这样做

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

【讨论】:

    【解决方案4】:

    Userdefaults 不用于数据存储。这是为了用户偏好。不知何故,我认为“我从 pickerDate 中挑选的所有日期”不是用户偏好。

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

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

    【讨论】:

    • 是的,你是对的,UserDefaults 不是用于数据存储,但我有点困惑,你能发展你的想法。非常感谢。
    猜你喜欢
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多