2009-12-16 2 views
1

다음 클래스가 있습니다 :내 NSWindow 서브 클래스에서 "아카이브를 지원하지 않습니다"라는 이유는 무엇입니까?

@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을 준수한다는 것을 의미합니까?

답변

4

:

참고 : NSWindow 표시 클래스는 NSResponder에에서 NSCoding 프로토콜을 상속하지만, 클래스 코딩을 지원하지 않습니다. 아카이브에 대한 레거시 지원은 있지만 사용은 권장되지 않으며 작동하지 않을 수도 있습니다. 키순 코딩 객체를 사용하여 NSWindow 객체를 아카이브하거나 보관 취소하려는 경우 NSInvalidArgumentException 예외가 발생합니다.

1

클래스가 전체 프로토콜을 구현하거나 encodeWithCoder 만 구현합니까? "필수"라고 표시된 방법은 선택 사항이 아닙니다.

+0

나는 둘 다 가지고있다 : - (id) initWithCoder : (NSCoder *) aDecoder; - (void) encodeWithCoder : (NSCoder *) aCoder; ... 내 encodeWithCoder가 NSLog 문을 통해 호출되고 있음을 알았으므로이 문제는 아님 (이 문제를 생각해 주셔서 감사합니다. :-)) –

-1

좋아, 내가 MVC 모델과의 간섭에 희생 된 것처럼 보입니다. NSview & NSWindow는 NSCoding 작업을 수행하지 않습니다. 스트레이트 NSWindow 표시 문서에서

+1

NSView가 수행하는 것이 확실합니다. NSWindow는 그렇지 않습니다. IB와 AppKit의 nib 시스템은 nib 아카이브에 NSWindow 인스턴스로 보이는 것을 저장하는 특별한 마술을 수행합니다. 그들은 실제로 NSWindow 인스턴스를 일반적인 보관 API를 통해 배치하지 않습니다. –

관련 문제