Iphone NSCoding持久化UIImage

Iphone NSCoding持久化UIImage,iphone,ios,xcode,uiimageview,uiimage,Iphone,Ios,Xcode,Uiimageview,Uiimage,我看到了与此主题相关的关于stackoverflow的不同问题。有人说NSCoding不符合UIImage,还有人说在ios5中,它确实符合UIImage 我想在我的应用程序中保留图像。我使用编码和解码的方法和一切标题,标签等是坚持,但不是图像 - (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:title forKey:@"title"]; [aCoder encodeObject:link forK

我看到了与此主题相关的关于stackoverflow的不同问题。有人说NSCoding不符合UIImage,还有人说在ios5中,它确实符合UIImage

我想在我的应用程序中保留图像。我使用编码和解码的方法和一切标题,标签等是坚持,但不是图像

- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:title forKey:@"title"];
    [aCoder encodeObject:link forKey:@"link"];
    [aCoder encodeObject:creator forKey:@"creator"];
    [aCoder encodeObject:pubDate forKey:@"pubDate"];
  //  [aCoder encodeObject:thumbnail forKey:@"thumbnail"];
    [aCoder encodeObject:UIImagePNGRepresentation(thumbnail) forKey:@"thumbnail"];
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self)
    {
        [self setTitle:[aDecoder decodeObjectForKey:@"title"]];
        [self setLink:[aDecoder decodeObjectForKey:@"link"]];
        [self setCreator:[aDecoder decodeObjectForKey:@"creator"]];
        [self setPubDate:[aDecoder decodeObjectForKey:@"pubDate"]];
        [self setThumbnail:[aDecoder decodeObjectForKey:@"thumbnail"]];        
    }
    return self;
}
我也在使用UIPNGRepresentation,但它不起作用。有人能帮我吗


谢谢。

您没有对图像进行编码。UIImagePNGRepresentation返回NSData对象。NSData符合NSSecureCodeding。我以前没用过,但医生说你必须这样解码:

id obj = [decoder decodeObjectOfClass:[MyClass class] forKey:@"myKey"];
编辑后:上述内容似乎没有必要。我在一个测试应用程序中使用了以下代码,编码和解码图像的两种方法都有效

- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.name forKey:@"personName"];
    [aCoder encodeObject:self.image2 forKey:@"thumbnail2"];
    [aCoder encodeObject:UIImagePNGRepresentation(self.image1) forKey:@"thumbnail"];
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self)
    {
        [self setName:[aDecoder decodeObjectForKey:@"personName"]];
        [self setImage2:[aDecoder decodeObjectForKey:@"thumbnail2"]];
        [self setImage1:[UIImage imageWithData:[aDecoder decodeObjectForKey:@"thumbnail"]]];
    }
    return self;
}

正如Aleph所说,问题一定出在别处。

您没有对图像进行编码。UIImagePNGRepresentation返回NSData对象。NSData符合NSSecureCodeding。我以前没用过,但医生说你必须这样解码:

id obj = [decoder decodeObjectOfClass:[MyClass class] forKey:@"myKey"];
编辑后:上述内容似乎没有必要。我在一个测试应用程序中使用了以下代码,编码和解码图像的两种方法都有效

- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.name forKey:@"personName"];
    [aCoder encodeObject:self.image2 forKey:@"thumbnail2"];
    [aCoder encodeObject:UIImagePNGRepresentation(self.image1) forKey:@"thumbnail"];
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self)
    {
        [self setName:[aDecoder decodeObjectForKey:@"personName"]];
        [self setImage2:[aDecoder decodeObjectForKey:@"thumbnail2"]];
        [self setImage1:[UIImage imageWithData:[aDecoder decodeObjectForKey:@"thumbnail"]]];
    }
    return self;
}
正如Aleph所说,问题一定出在别处。

试试这个:


- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:title forKey:@"title"];
    [aCoder encodeObject:link forKey:@"link"];
    [aCoder encodeObject:creator forKey:@"creator"];
    [aCoder encodeObject:pubDate forKey:@"pubDate"];
    NSData* data = UIImagePNGRepresentation(thumbnail);
    NSLog(@"Data length: %d", data.length);
    [aCoder encodeObject:data forKey:@"thumbnail"];
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self)
    {
        [self setTitle:[aDecoder decodeObjectForKey:@"title"]];
        [self setLink:[aDecoder decodeObjectForKey:@"link"]];
        [self setCreator:[aDecoder decodeObjectForKey:@"creator"]];
        [self setPubDate:[aDecoder decodeObjectForKey:@"pubDate"]];
        NSData* data = [aDecoder decodeObjectForKey:@"thumbnail"];
        NSLog(@"Data length: %d", data.length);
        [self setThumbnail:[UIImage imageWithData:data]];        
    }
    return self;
}
试试这个:


- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:title forKey:@"title"];
    [aCoder encodeObject:link forKey:@"link"];
    [aCoder encodeObject:creator forKey:@"creator"];
    [aCoder encodeObject:pubDate forKey:@"pubDate"];
    NSData* data = UIImagePNGRepresentation(thumbnail);
    NSLog(@"Data length: %d", data.length);
    [aCoder encodeObject:data forKey:@"thumbnail"];
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self)
    {
        [self setTitle:[aDecoder decodeObjectForKey:@"title"]];
        [self setLink:[aDecoder decodeObjectForKey:@"link"]];
        [self setCreator:[aDecoder decodeObjectForKey:@"creator"]];
        [self setPubDate:[aDecoder decodeObjectForKey:@"pubDate"]];
        NSData* data = [aDecoder decodeObjectForKey:@"thumbnail"];
        NSLog(@"Data length: %d", data.length);
        [self setThumbnail:[UIImage imageWithData:data]];        
    }
    return self;
}


首先。。您必须使用相同的按键thumnail或缩略图:我正在使用…简单…encodeObject:image forKey…其中image是UIImage variablemy类-@TonyMkenu使用简单的encodeObject:image也不工作,这就是为什么我在代码中对此进行了注释。首先。。您必须使用相同的按键thumnail或缩略图:我正在使用…简单…encodeObject:image forKey…其中image是UIImage变量类-@TonyMkenu使用简单的encodeObject:image也不工作,这就是我在代码中对此进行注释的原因。我还使用了[self-setThumbnail:[UIImage imageWithData:[aDecoder decodeObjectForKey:@thumbnail]];但这也不起作用这不是对UIImage进行完全编码和解码,因为它不是对UIImage.scale属性进行编码和解码。您可以使用imageWithData:scale:为此,我还使用了[self-setThumbnail:[UIImage imageWithData:[aDecoder decodeObjectForKey:@thumbnail]];但这也不起作用这不是对UIImage进行完全编码和解码,因为它不是对UIImage.scale属性进行编码和解码。您可以使用imageWithData:scale:为此,请尝试您提供的代码。它不起作用。令我惊讶的是,控制台中的数据长度是零。编码时是零吗?尝试记录缩略图对象。我已使用NSLog@Data长度1:%d,data.length;在编码器和编码器中NSLog@Data长度2:%d,data.length;在initWithCoder中。这两个日志在控制台中都给出了“0”,如果您在编码时得到0,这意味着图像为nil或无法编码为PNG。检查您是否有一个有效的编码图像。如果你编码0个字节,你当然会在解码时得到0个字节。如果你的图像为零,那么你在其他地方有问题。可能创建一个新问题并发布更多代码。只需尝试您提供的代码。它不起作用。令我惊讶的是,控制台中的数据长度是零。编码时是零吗?尝试记录缩略图对象。我已使用NSLog@Data长度1:%d,data.length;在编码器和编码器中NSLog@Data长度2:%d,data.length;在initWithCoder中。这两个日志在控制台中都给出了“0”,如果您在编码时得到0,这意味着图像为nil或无法编码为PNG。检查您是否有一个有效的编码图像。如果你编码0个字节,你当然会在解码时得到0个字节。如果你的图像为零,那么你在其他地方有问题。可能会创建一个新问题并发布更多代码。