iOS / iPhone SDK: initWithCoder и encodeWithCoder не вызывается - PullRequest
2 голосов
/ 20 сентября 2010

Я пытаюсь сохранить NSMutableArray с именем queueArray, чтобы его можно было снова загрузить после завершения работы приложения.Я использовал несколько учебных пособий, чтобы начать работу, и вот код, который я придумал.Похоже, проблема в том, что «initWithCoder» и «encodeWithCoder» не вызываются, что отображается без вызовов NSLog и без остановки в точках останова.Я добавил протокол NSCoding в файл .h, и я знаю, что queueArray - это не ноль, и он содержит MPMediaItem s.Вот часть кода, который я использую, чтобы попытаться сохранить и загрузить массив:

-(IBAction)saveQueuePressed {

     NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
     NSString *filePath = [rootPath stringByAppendingPathComponent:@"queueArray.archive"];

     //should cause encodeWithCoder to be called
     [NSKeyedArchiver archiveRootObject:queueArray toFile:filePath];

}

-(IBAction)loadQueuePressed {

     NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
     NSString *filePath = [rootPath stringByAppendingPathComponent:@"queueArray.archive"];

     //should cause initWithCoder to be called
     queueArray = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

}

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

     NSLog(@"encodeWithCoder");

     [coder encodeObject:queueArray forKey:@"savedQueueArray"];
}



-(id)initWithCoder:(NSCoder *)decoder {

     NSLog(@"initWithCoder");

     queueArray = [decoder decodeObjectForKey:@"savedQueueArray"];

     return self;

}

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

1 голос
/ 20 сентября 2010

Методы encodeWithCoder: и initWithCoder вызываются, когда вы архивируете / разархивируете объект, который отвечает на них.Насколько я понимаю, у вас есть эти методы в вашем классе, но объект, который вы на самом деле архивируете (queueArray), не является экземпляром этого класса, это NSMutableArray.

Если вы действительно хотитесохранить весь объект, вы можете изменить метод saveQueue на

-(IBAction)saveQueuePressed {

    NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *filePath = [rootPath stringByAppendingPathComponent:@"queueArray.archive"];

    // saving the array shouldn't, but saving the self object
    //should cause encodeWithCoder to be called:
    [NSKeyedArchiver archiveRootObject:self toFile:filePath];
}

Но если вы просто хотите сохранить массив, я думаю, вы можете просто использовать saveQueuePressed и loadQueuePressed, я недумаю, вам нужны encode/init WithCoder: методы

Обновление: Возможно, ваш путь не верный.Попробуйте

NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filePath = [[rootPath stringByAppendingPathComponent:@"queueArray.archive"] stringByExpandingTildeInPath]];
0 голосов
/ 17 февраля 2012

Филипп прав! Ваш комментарий сказал, что вы все еще не использовали его метод.

У меня тоже была эта проблема. Переключение с атомарного метода записи словаря на keyedArchiver исправило это, к счастью, мне нужно было всего лишь изменить одну вещь: строка с именем writeToFile: теперь является функцией архива.

Теперь моя программа работает. По какой-то причине, даже при ответе на NSCoding, пользовательский объект не кодируется и ломает мой словарь. Это ошибка с iOS? Я прочитал довольно много руководств Apple, но я также видел немало опечаток и недостающей информации (например, попробуйте функции MKMapRect без видео, чтобы объяснить их) или Core Animations, ссылающиеся на Run Loop, прежде чем вы узнаете я могу продолжить, наполовину законченные предложения в Quartz ... так что, да, я прочитал руководства, и это озадачивает меня, в какой-то момент мы должны получить более открытый iOS SDK, надеюсь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...