为什么我在NSWindow子类中得到“不支持存档”?

时间:2009-12-16 20:00:09

标签: cocoa nswindow nskeyedarchiver

我有以下课程:

@interface SpWindow : NSWindow <NSCoding> {
  BOOL _editMode;
  SpBgView *bgView;
} ...

...然后我将其称为存档。我的编码方法如下:

- (void) encodeWithCoder:(NSCoder *)aCoder {
  NSLog(@"encodeWithCoder CALLED FOR SpWindow");
  [super encodeWithCoder:aCoder];
  NSLog(@"SpWindow's encodeWithCoder got past the super call");  
  [aCoder encodeObject:bgView forKey:@"bgView"];
  [aCoder encodeBool:_editMode forKey:@"_editMode"];  
}

...但[super encodeWithCoder:aCoder];位导致控制台日志中出现以下内容:

encodeWithCoder CALLED FOR SpWindow
<SpWindow: 0x20009f660> does not support archiving
*** -[NSKeyedArchiver finalize]: warning: NSKeyedArchiver finalized without having had -finishEncoding called on it.

...根据NSWindow文档,该类符合NSCoding协议,所以我不知道为什么我会看到这个问题。

有什么想法吗?

---编辑: NSWindow的课程参考显示:

Conforms to NSCoding (NSResponder)

... NOT 只是"Conforms to NSCoding" - 所以我猜这是否意味着只有NSResponder位符合NSCoding?

3 个答案:

答案 0 :(得分:4)

直接来自NSWindow文件:

  

注意:虽然NSWindow类继承了NSResponder的NSCoding协议,但该类不支持编码。存在对归档程序的遗留支持,但其使用已弃用,可能无效。任何使用键控编码对象归档或取消归档NSWindow对象的尝试都会引发NSInvalidArgumentException异常。

答案 1 :(得分:1)

您的类是否实现整个协议或仅编码加入?标记为“必需”的方法不是可选的。

答案 2 :(得分:-1)

好吧,看起来我是我干涉MVC模型的受害者 - NSview&amp; NSWindow不做NSCoding的事情。