NSKeyedArchiver не сохраняет все свойства объекта

#objective-c #cocoa #nskeyedarchiver

#objective-c #cocoa #nskeyedarchiver

Вопрос:

У меня возникла проблема, из-за которой я сохраняю, среди прочего, массив «узлов» (заголовок ниже), который обладает свойством цвета и тега. Когда он сохраняет как — (void)saveDataToDiskWithPath:(NSURL*)путь, журнал показывает, что эти свойства существуют. Когда я позже снова загружаю массив из сохраненного файла, рамка узла сохраняется, но каждый узел в массиве потерял свой тег и цвет…есть идеи, почему? Что я мог делать неправильно? Может быть, я просто устал, и все это обретет смысл позже…

Node.h:

 //
//  Node.h
//

#import <Cocoa/Cocoa.h>


@interface Node : NSView {
@private
    NSColor *thisColor;
    NSColor *originalColor;
    NSRect dragRect;
    BOOL msDn;
    long tag;
    BOOL amSelected;
}

@property long tag;
@property (nonatomic, retain) NSColor* originalColor;

- (id)initWithFrame:(NSRect)frame andColor:(NSColor*)color;
- (void)select:(BOOL)yesOrNo;

@end
  

Метод сохранения:

 - (void) saveDataToDiskWithPath:(NSURL*)path
{
    NSLog(@"Path is %@", [path absoluteString]);
    NSMutableDictionary * rootObject;
    rootObject = [NSMutableDictionary dictionary];
    for(Node* node in [sharedValues nodes]){
        NSLog(@"Node has color %@ and tag %ld.", [node originalColor], [node tag]);
    }
    [rootObject setValue: [imageView aPath] forKey:@"path"];
    [rootObject setValue:[sharedValues nodes] forKey:@"nodes"];
    [NSKeyedArchiver archiveRootObject: rootObject toFile: [path path]];
}
  

Метод загрузки:

 - (void)loadDataFromDiskWithPath:(NSURL*)path
{
    NSDictionary * rootObject;

    rootObject = [NSKeyedUnarchiver unarchiveObjectWithFile:[path path]];    
    [imageView setAPath:[rootObject valueForKey:@"path"]];
    [sharedValues setNodes:[rootObject valueForKey:@"nodes"]];
    [imageView setNeedsDisplay:YES];
}
  

Ответ №1:

Вам придется принять NSCoding протокол и реализовать методы -initWithCoder: и -encodeWithCoder: , чтобы объект был правильно заархивирован. Поскольку Node это подкласс UIView , который принимает протокол, некоторые его части архивируются правильно. Это свойства UIView и его родительских классов. Чтобы обеспечить надлежащее архивирование, Node также должен будет реализовать протокол. Просмотрите этот документ для получения дополнительной информации.