코코아 초보자가 여기 있습니다. 파일에 저장하기 위해 NSView 내부에서 인스턴스 변수를 인코딩하려고했습니다. 하지만 인코딩 할 때마다 initWithFrame :이 호출 될 때 (null로) 겹쳐 쓰여지고 있습니다. 이 동작을 건너 뛰고 아카이브되지 않은 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 : log 주석에서 null로 바뀌고 녹색 화면이 다시 나타납니다. 보이는 것에서 볼 때 유일한 방법은 데이터를 뷰에서 분리하는 것입니다. 그러나 더 간단한 방법이 있다면 아무도 나를 도울 수 있습니까? 당신은 구현 ("하는 .m") 파일에 인스턴스 변수를 선언하지
@implementation Tragic {
NSColor *color;
}
어떻게 저장됩니까? 언제 인코딩하는거야? 그리고 인코딩하면, initWithFoder가 아닌 initWithCoder : 메소드를 사용하여 다시 작성해야합니다. 위의 코드는 지저분하지만 올바르게 사용하면 작동합니다. – Wain
문서 기반 응용 프로그램을 사용하고 있습니다. 그리고 이것은 문서가 저장 될 때 인코딩됩니다. NSKeyedArchiver를 사용하여 보관 처리되는 메인 파일의 콘센트가 있습니다. –
그래서 앱을 구조화하는 올바른 방법은 문서에 color 속성을두고 문서의 다른 내용과 함께 color 속성을 저장 한 다음보기에 전달하는 것입니다. 문서 제어기가 통과해야합니다. 이것은 MVC 구조의 기본입니다 - 모델은 데이터를 저장하고,보기는 그것을 표시하고, 컨트롤러는 컨트롤러를 중재합니다. – Wain