NSUserDefaults сохраняет только последнее значение

У меня есть проблема, если кто-то может мне помочь или дать совет, кто сталкивался с подобной проблемой. Хорошо, я сохраняю данные в 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 ответа

Решение

Проблема в том, что вы не используете 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 в качестве объекта, или используйте уникальный ключ для каждой записи.

Я не думаю, что это его проблема. 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];

Но это вам не поможет, так как он будет вызываться при каждом изменении поля, то есть: он будет вызываться после изменения поля месяца, один раз при изменении поля дня и так далее.

)

Может быть, вы можете включить готовую кнопку в указатель даты и вызвать метод, который будет сохранять дату в массиве, когда пользователь нажимает на эту кнопку...

Userdefaults не для хранения данных. Это для пользовательских настроек. Почему-то я думаю, что "все даты, которые я выбираю из pickerDate", не являются предпочтениями пользователя.

Вместо того, чтобы пытаться хранить NSDateВы можете просто хранить NSNumber@(date.timeIntervalSinceReferenceDate), Делает это намного проще.

И если вы хотите хранить более одной даты - это то, что NSArray там для.

Я думаю, что вы сохраняете дату в NSdate формат и получаете дату в NSString.

Делай так

NSData *theData = [[NSUserDefaults standardUserDefaults] objectForKey:@"data"];
 NSDate *date =[NSKeyedUnarchiver unarchiveObjectWithData:theData];
Другие вопросы по тегам