【问题标题】:NSKeyedArchiver not saving all properties of an objectNSKeyedArchiver 不保存对象的所有属性
【发布时间】:2011-05-17 05:23:49
【问题描述】:

我遇到了一个问题,我要保存一个包含颜色和标签属性的“节点”数组(下面的标题)。当它保存为 - (void)saveDataToDiskWithPath:(NSURL*)path 时,日志显示这些属性存在。当我稍后从保存的文件中再次加载数组时,节点的框架仍然存在,但是数组中的每个节点都丢失了它的标签和颜色......有什么想法吗?我可能做错了什么?可能我只是累了,以后再说吧……

节点.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];
}

【问题讨论】:

    标签: objective-c cocoa nskeyedarchiver


    【解决方案1】:

    您必须采用NSCoding 协议并实现-initWithCoder:-encodeWithCoder: 方法才能正确归档对象。由于Node 是采用该协议的UIView 的子类,因此它的某些部分正在正确归档。这些是 UIView 及其父类的属性。为了确保正确归档,Node 也必须实现该协议。通过this doc 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-05
      • 2014-03-07
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多