0

ココア初心者です。NSView 内のインスタンス変数をエンコードしてファイルに保存しようとしていました。しかし、エンコードするたびに、initWithFrame: が呼び出されたときに (null) に上書きされます。この動作をスキップして、アーカイブされていない 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: ログ コメントで null に戻り、再びグリーン スクリーンが表示されます。見た目から、ビューからデータを分離する唯一の方法のようです。しかし、もっと簡単な方法があれば、誰でも私を助けることができますか?

4

1 に答える 1

-3

コードのこの部分は意味がありません...

@implementation Tragic {
NSColor *color;

}

実装 (".m") ファイルでインスタンス変数を宣言しません。これは、インターフェース (".h") ファイルで行います。.m ファイルでは、実装ステートメントの周りにこれらのブラケットも含めないでください。

.m ファイルで color 変数を作成できますが、それは他のクラスからアクセス可能な「インスタンス」変数にはなりません。作成する場合は、括弧内に配置しないでください。

于 2013-04-13T23:51:32.107 に答える