2012-02-07 2 views
0

У меня есть приложение с массивом объектов, которые я заархивированы и Разархивированфотографии Сохранение в IPhone приложения

-(id)initWithCoder:(NSCoder *)aDecoder{ 
    title = [aDecoder decodeObjectForKey:@"Title"]; 
    image = [aDecoder decodeObjectForKey:@"Image"]; 
    return self; 
} 

-(void)encodeWithCoder:(NSCoder *)aCoder{ 
    [aCoder encodeObject:title forKey:@"Title"]; 
    [aCoder encodeObject:image forKey:@"Image"]; 
} 

будет UIImage магазин в порядке таким образом?

ответ

0

Coder и Decoder, который был осуществить в вопросе ОК

+1

Вы пробовали его в iOS 4.3? Похоже, что Apple добавила поддержку NSCoding для UIImage в iOS5, но ее там не было в iOS4, поэтому я уверен, что она сработает, если вы запустите ее в симуляторе 4.3, и в этом случае вам все равно придется использовать мое решение, если вы ориентируетесь только на 5.0. –

+0

извините, но ваше решение не работает на ios5 –

+1

Что произойдет, если вы попробуете его на iOS5? –

4

Нет, 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 дополнительную настройку.

+0

пользователь может добавить JPEG или PNG, мы не знаем. будет ли он работать нормально, если мое изображение находится в формате JPEG? или как мне реализовать encodeWithCoder? –

+1

PNG без потерь, поэтому его можно использовать для сохранения JPEG без потери качества, но изображения будут больше, чем они должны быть. Я знаю тип файла, который вы можете сохранить с помощью UIImageJpegRepresentation. –

+1

Почему вы не приняли? Разве это не сработало для вас? –