0

私は OSX アプリに取り組んでおり、カスタム クラスの情報を保存する必要があるため、NSCoder を使用してインデックスを作成しようとしています。ただし、クラスでエンコード/デコードしようとしているオブジェクトの 1 つは NSImage であり、encodeWithCoder: または initWithCoder: を実行しようとするたびに、次の 2 つのエラー メッセージのいずれかが表示されます。

Warning - attempting to encode NSCGSImageRep
Warning - attempting to decode NSCGSImageRep

これが私の.mです:

@implementation Subject

-(id) init{
    self = [super init];
    if (self) {
        self.ad = [[NSApplication sharedApplication] delegate];
        self.editViewController = self.ad.editViewController;
        self.name = @"";
        self.teacher = @"";
        self.mainPeriod = 1;
    }

    return self;
}
-(void) encodeWithCoder: (NSCoder *) coder{
    [coder encodeObject:self.name forKey:@"name"];
    [coder encodeObject:self.teacher forKey:@"teacher"];
    NSNumber *periodNumBox = [NSNumber numberWithInt:self.mainPeriod];
    [coder encodeObject:periodNumBox forKey:@"mainPeriod"];
    [coder encodeObject:self.image forKey:@"image"];
}
-(id) initWithCoder: (NSCoder *) coder{
    self.name = [coder decodeObjectForKey:@"name"];
    self.teacher = [coder decodeObjectForKey:@"teacher"];
    NSNumber *periodNumBox = [coder decodeObjectForKey:@"mainPeriod"];
    self.mainPeriod = (int)[periodNumBox integerValue];
    self.image = [coder decodeObjectForKey:@"image"];
    return self;
}
@end

と私の .h:

#import <Foundation/Foundation.h>
#import "AppDelegate.h"
#import "EditViewController.h"

@class EditViewController;

@interface Subject : NSObject

@property (weak) AppDelegate *ad;
@property EditViewController *editViewController;

@property NSImage *image;
@property NSString *name;
@property NSString *teacher;
@property int mainPeriod;

@end
4

2 に答える 2

3

これはあなたが求めているものではありませんが、検討する価値のある解決策かもしれません: しないでください. デコード時に画像が別の場所に存在することが保証されている場合、アーカイブする必要があるのは、画像の名前またはその他の参照だけです。イメージがデコード時に他の場所に存在することが保証されていない場合は、存在が保証されるディスクに保存し名前またはその他の参照をアーカイブします。

画像を NSData に変換する方法については、こちらの回答もご覧ください。

https://stackoverflow.com/a/15694549/341994

NSData は、ディスク上のファイルに直接書き込むことができます。もちろん、NSData オブジェクトはアーカイブ可能であるため、アーカイブに入れることができます。エンコードとデコードで動作します。しかし、私はあなたがそうしないことを好むべきだとまだ主張します.

于 2013-04-14T16:24:54.560 に答える