NSUserDefaults: возвращает целое число, а не возвращает NSArray - PullRequest
0 голосов
/ 07 марта 2012

Я пытаюсь сохранить как целое число, так и NSArray с NSUserDefaults, но я могу только правильно получить целое число. Когда я пытаюсь восстановить NSArray, он возвращает пустой массив.

Я начинаю с пользовательского класса XMLParser.m.

// XMLParser.m

//NSArray 'stored' correctly contains 10 data objects. 'stored' is an NSArray property of the XMLParser class
numberOfEvents = [stored count];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:stored forKey:@"eventsList"];
[defaults setInteger:numberOfEvents forKey:@"numberOfEvents"];
[defaults synchronize];

Но когда я пытаюсь получить доступ к данным в другом классе, т.е. мой AppDelegate, я получаю пустой NSArray

//myApplicationAppDelegate.m
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
int value = [defaults integerForKey:@"numberOfEvents"];  //returns 10
parsedEventsList = [defaults arrayForKey:@"eventsList"];  //parsedEventsList is an NSArray property of myApplicationAppDelegate class
int value2 = [parsedEventsList count]; //***returns 0***

Я даже пытался использовать

[defaults objectForKey:@"eventsList"]

и он по-прежнему ничего не возвращает.

Мысли? Спасибо!

Ответы [ 2 ]

1 голос
/ 07 марта 2012

Все ваши объекты в массиве stored должны быть объектами списка свойств (т.е. экземплярами NSData, NSDate, NSNumber, NSString, NSArray или NSDictionary).

0 голосов
/ 07 марта 2012

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

- (void)encodeWithCoder:(NSCoder *)encoder {

   //Encode properties, other class variables, etc
   [encoder encodeObject:self.obj1 forKey:@"obj1"];
   [encoder encodeObject:self.obj2 forKey:@"obj2"];
}

- (id)initWithCoder:(NSCoder *)decoder {
   if((self = [super init])) {
       //decode properties, other class vars
       self.obj1 = [decoder decodeObjectForKey:@"obj1"];
       self.obj2 = [decoder decodeObjectForKey:@"obj2"];
   }
return self;
}
...