0

我正在开发一个 OSX 应用程序并且需要保存自定义类的信息,所以我尝试使用 NSCoder 对其进行索引;但是,我试图在类中编码/解码的对象之一是 NSImage,每次我尝试运行 encodeWithCoder: 或 initWithCoder: 我都是以下两条错误消息之一:

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 回答
0

在 macOS 10.15 上,我可以毫无问题地对 NSImage 进行编码。

于 2019-12-28T21:52:40.777 回答