2013-04-14 3 views
0

Я работаю над OSX-приложением и должен сохранять информацию пользовательского класса, поэтому я пытаюсь проиндексировать его с помощью NSCoder; Однако, один из объектов Я пытаюсь кодировать/декодировать в классе является NSImage, и каждый раз, когда я пытаюсь запустить encodeWithCoder: или initWithCoder: Я один из этих сообщений две ошибки:Кодирование/декодирование NSImage

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 
+1

проверьте это, это может помочь вам [написать NSImage в файл] (http://stackoverflow.com/questions/3038820/how-to-save-a-nsimage-as-a-new-file) –

ответ

2

Это не совсем то, что вы просите, но это может быть решение, которое стоит рассмотреть: не надо. Если изображение, как гарантируется, будет существовать в другом месте во время декодирования, все, что вам нужно заархивировать, это имя или другое ссылка. Если изображение не гарантируется в другом месте при декодировании, то сохраните его на диск, где будет будет, и запишите имя или другое ссылка.

Пожалуйста, смотрите также мой ответ здесь о том, как преобразовать изображение в NSData:

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

NSData могут быть записаны непосредственно в файл на диске. Конечно, поскольку объект NSData является архивируемым, вы можете теперь поместить его в архив; он будет работать с кодированием и декодированием. Но я бы все же утверждал, что вы не должны этого делать.

+0

Очень умный, спасибо! –