我正在开发一个OSX应用程序,需要保存一个自定义类的信息,所以我尝试使用NSCoder对其进行索引;但是,我尝试在该类中编码/解码的对象之一是NSImage,并且每次我尝试运行encodeWithCoder:或initWithCoder: i时,都会出现以下两个错误消息之一:
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发布于 2013-04-15 00:24:55
这可能不是你想要的,但它可能是一个值得考虑的解决方案:不要。如果在解码时保证图像存在于其他地方,那么您需要存档的只是图像的名称或其他引用。如果解码时图像不能保证存在于其他位置,则将其保存到保证存在的磁盘上,并将名称或其他对其的引用存档。
关于如何将图像转换为NSData,请参阅此处的答案:
https://stackoverflow.com/a/15694549/341994
可以将NSData直接写入磁盘上的文件。当然,因为NSData对象是可归档的,所以您现在可以将其放入归档中;它将用于编码和解码。但我仍然认为,您不应该这样做。
发布于 2019-12-29 05:52:41
在macOS 10.15上,我可以毫无问题地对NSImages进行编码。
https://stackoverflow.com/questions/16001144
复制相似问题