Как сохранить NSView без перезаписи переменных экземпляра initWithFrame:?

Какао новичок здесь. Я пытался закодировать переменную экземпляра внутри NSView, чтобы сохранить в файл. Но всякий раз, когда я кодирую его, он перезаписывается (ноль) при вызове initWithFrame:. Есть ли способ, которым я могу пропустить это поведение и загрузить переменные экземпляра в разархивированный NSView? Вот код, который у меня есть:

#import "Tragic.h"

@implementation Tragic {
    NSColor *color;
}


- (id)initWithFrame:(NSRect)frame {

    self = [super initWithFrame:frame];
    if (self) {
        NSLog(@"%@",color);
    }

    return self;
}

- (void)drawRect:(NSRect)dirtyRect {
    if(!color) {
        color = [NSColor greenColor];
    }

    [color set];
    color = [NSColor yellowColor];
    NSRectFill([self bounds]);
}

-(void)encodeWithCoder:(NSCoder *)aCoder {
    [super encodeWithCoder:aCoder];
    [aCoder encodeObject:color forKey:@"color"];
}

-(id)initWithCoder:(NSCoder *)aDecoder {
    if(self = [super initWithCoder:aDecoder]) {
        color = [aDecoder decodeObjectForKey:@"color"];
    }
    return self;
}
@end

В приведенном выше коде я сначала устанавливаю зеленый цвет для заливки, а сразу после завершения drawRect: метод меняет его на желтый, поэтому сохраняемый цвет - желтый. Но, тем не менее, он возвращается к нулю в initWithFrame: комментарии к журналу, и я снова получаю зеленый экран. Судя по всему, единственный способ отделить данные от представления. Но если есть более простой способ, кто-нибудь может мне помочь?

1 ответ

Эта часть вашего кода не имеет смысла...

@implementation Tragic {
NSColor *color;

}

Вы не объявляете переменные экземпляра в файле реализации (".m"). Вы делаете это в файле интерфейса (".h"). Файл.m также не должен иметь этих скобок вокруг оператора реализации.

Вы можете создать переменную цвета в файле.m, но она не будет переменной "экземпляра", доступной из других классов, и если вы сделаете это, она не должна быть в скобках.

Другие вопросы по тегам