1

このトピックに関連するスタックオーバーフローに関する別の質問を見ました。NSCoding準拠していないと言う人もいればUIImage、iOS 5 では準拠すると言う人もいます。

アプリで画像を保持したい。メソッドとすべて (タイトル、ラベルなど) は永続的ですが、画像は永続的ではありませんencodedecode

- (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いますが、うまくいきません。誰かがこれで私を助けることができますか?

ありがとう。

4

2 に答える 2

7

画像をエンコードしていません。UIImagePNGRepresentation()はNSDataオブジェクトを返します。NSDataはNSSecureCodingに準拠しています。私はこれまでこれを使ったことがありませんが、ドキュメントには次のようにデコードする必要があると書かれています。

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;
}

アレフが言ったように、問題は他の場所にあるに違いありません。

于 2013-01-14T06:32:44.903 に答える
2

これを試して:


- (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;
}
于 2013-01-14T20:07:42.827 に答える