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, поэтому я понятия не имею, почему я вижу эту проблему.

Любые идеи?

--- EDIT: Ссылка класс для NSWindow показывает:

Conforms to NSCoding (NSResponder) 

... НЕ просто "Conforms to NSCoding" - так что я думаю, это означает, что только биты NSResponder соответствуют NSCoding?

ответ

4

Прямо из документации NSWindow:

Примечание: Хотя класс NSWindow наследует протокол NSCoding от NSResponder, класс не поддерживает кодирование. Существует устаревшая поддержка архиваторов, но ее использование устарело и может не работать. Любая попытка архивировать или разблокировать объект NSWindow с использованием объекта с ключом кодирования вызывает исключение NSInvalidArgumentException.

1

Содержит ли ваш класс весь протокол или просто encodeWithCoder? Методы, помеченные как обязательные, не являются необязательными.

+0

У меня есть и другое: - (ID) initWithCoder: (NSCoder *) aDecoder; - (void) encodeWithCoder: (NSCoder *) aCoder; ... учитывая, что я могу сказать, что мой encodeWithCoder получает вызов (через инструкцию NSLog я предполагаю, что это не проблема (но спасибо за это :-)) –

-1

ОК, похоже, что я жертва моего вмешательства с MVC-моделью - NSview & NSWindow не выполняет функцию NSCoding.

+1

Я уверен, что NSView делает, но вы правы, что NSWindow этого не делает. IB и система nib в AppKit делают специальную магию, чтобы хранить то, что кажется экземплярами NSWindow в архивах nib; они фактически не помещают экземпляр NSWindow через обычный API архивирования. –

 Смежные вопросы

  • Нет связанных вопросов^_^