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];