Нет, UIImage не соответствует протоколу NSCoding.
Чтобы сохранить изображение, преобразуйте его в NSData с помощью UIImageJPEGRepresentation(image, quality)
или UIImagePNGRepresentation(image)
, а затем вы можете сохранить объект NSData в своем кодере, потому что он соответствует NSCoding.
Как это:
-(id)initWithCoder:(NSCoder *)aDecoder{
if ((self = [super init])){
title = [aDecoder decodeObjectForKey:@"Title"];
image = [UIImage imageWithData:[aDecoder decodeObjectForKey:@"ImageData"]];
}
return self;
}
-(void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:title forKey:@"Title"];
[aCoder encodeObject:UIImagePNGRepresentation(image) forKey:@"ImageData"];
}
PS, я полагаю, вы используете ARC? Если это не так, вам нужно сохранить значения в методе initWithCoder, потому что decodeObjectForKey:
возвращает объект с автореализацией. Я также переписал ваш initWithCoder, чтобы включить обычную проверку super/nil, что является лучшей практикой.
Обратите внимание, что вы можете использовать self = [self init]
или self = [super initWithCoder:aDecoder]
вместо self = [super init]
, в зависимости от того, что такое ваш суперкласс, и добавляет ли ваш init дополнительную настройку.
Вы пробовали его в iOS 4.3? Похоже, что Apple добавила поддержку NSCoding для UIImage в iOS5, но ее там не было в iOS4, поэтому я уверен, что она сработает, если вы запустите ее в симуляторе 4.3, и в этом случае вам все равно придется использовать мое решение, если вы ориентируетесь только на 5.0. –
извините, но ваше решение не работает на ios5 –
Что произойдет, если вы попробуете его на iOS5? –