2009-07-02 2 views
12

В идеале NSCoding совместимый класс будет работать как с использованием encodeWithCoder: и initWithCoder: (по крайней мере, я так думал до недавнего времени) без разработчика приходится беспокоиться о том, что происходит внутри подпрограмм (если моя идея NSCoding соответствует классу не полностью облажались!) классiPhone. Почему в документации говорится, что UIImageView совместим с NSCoding?

UIImageView является NSCoding требований. Поэтому мне не нужно беспокоиться о том, как он будет сериализован/де-сериализован с использованием классов NSKeyedArchiver и NSKeyedUnarchiver. Но каждый раз, когда я пытаюсь кодировать объект UIImageView, я получаю сообщение об ошибке, которое UIImage не распознает encodeWithCoder: method.

Теперь UIImageView внутренне использует объект UIImage. Но разве кодирование не позаботилось об этом?

Или соответствие NSCoding указано в документации, просто дайте пользователю знать, что они могут реализовать методы initWithCoder и encodeWithCoder?

Может кто-то пожалуйста, разъяснить это для меня! Я полностью смущен!

ответ

33

Документация является ошибочной - UIImage не соответствует NSCoding, как вы заявили. Вы можете работать вокруг него (в примитивном смысле), делая работу самостоятельно:

@interface UIImage (NSCoding) 
- (id)initWithCoder:(NSCoder *)decoder; 
- (void)encodeWithCoder:(NSCoder *)encoder; 
@end 

@implementation UIImage (NSCoding) 
- (id)initWithCoder:(NSCoder *)decoder { 
    NSData *pngData = [decoder decodeObjectForKey:@"PNGRepresentation"]; 
    [self autorelease]; 
    self = [[UIImage alloc] initWithData:pngData]; 
    return self; 
} 
- (void)encodeWithCoder:(NSCoder *)encoder { 
    [encoder encodeObject:UIImagePNGRepresentation(self) forKey:@"PNGRepresentation"]; 
} 
@end 
+1

Спасибо, что я уже это делаю. Просто интересно (разыгрывая действительно), почему Apple вводит в заблуждение разработчиков! То же самое с 3.0, не имеющим упоминания о новом методе в UIImagePickerController в документах. – lostInTransit

+1

Определите файл ошибки документации в радаре (и добавьте его в OpenRadar, чтобы другие могли отслеживать прогресс). –

+0

Спасибо, Натан де Врис. Ваш ответ мне очень помогает при работе с CoreData! –

8

Этот вопрос заслуживает обновления начиная с прошивкой 5.1 добавлена ​​функциональность для NSCoding к UIImage, и Натан де Фриза ответ теперь будет вызывать предупреждения с последние компиляторы.

This question offers a solution, чтобы обойти эту проблему, если ваше приложение поддерживает IOS перед 5.1. Он делает в основном то же самое, что предлагает Натан, но проверяет, существует ли этот метод уже или нет, а не жестко его кодирует.

+0

Рад, что я прокрутил весь путь вниз по странице! Cheers buddy –

+0

Тот, кто проголосовал за это, должен быть избит ложкой: P – DougW