2017-09-05 14 views
1

XIB을 만듭니다.InitWithCoder는 Cocoa NSView 기반 클래스를 호출하지 않습니다.

MyCustomView이라는 클래스를 만들고이를 XIB의 파일 소유자에게 할당합니다.

- (instancetype)initWithCoder:(NSCoder *)aDecoder{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) [self load]; 
    return self; 
} 

- (instancetype)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) [self load]; 
    return self; 
} 

- (void)load { 

    NSArray* topLevelObjects; 
    [[NSBundle mainBundle] loadNibNamed:@"MyCustomView" 
           owner:self 
         topLevelObjects:&topLevelObjects]; 

    NSView* view; 
    for (id aView in topLevelObjects) { 
    if ([umaVista isKindOfClass:[NSView class]]) { 
     view = umaVista; 
     break; 
    } 
    } 

    [self addSubview:view]; 
    view.frame = self.bounds; 

} 

메인 앱에 NSView을 만듭니다.

해당보기가 MyCustomView으로 변경되었습니다.

나는 앱을 실행합니다. MyCustomViewinitWithCoder이 실행되지 않습니다. initWithFrame이 실행되지 않습니다. awakeFromNib이 실행되지 않습니다.

아무 반응이 없습니다.

아이디어가 있으십니까?

+0

"XIB의 첫 번째 응답자에게 할당"이란 무엇을 의미합니까? 첫 번째 응답자에게 아무 것도 "할당"할 수 없으며, 이는 동적 응답 응답자 값을 나타내는 프록시 항목입니다. –

+0

무엇을 의미합니까? 이것은 웹의 모든 자습서가 말하는 방법입니다. – SpaceDog

+0

"파일 소유자"에게 할당 했습니까? –

답변

1

"파일 소유자"as I've written elsewhere은 아카이브의 실제 개체가 아닙니다. 자리 표시 자입니다. 펜촉을 꺼내면 기존의 객체가 사용됩니다.

마치 사용자 정의보기의 인스턴스를 펜촉에 넣는 것처럼 보입니다. File 's Owner로 만들지 마시고, 오브젝트 팔레트에서 뷰를 드래그 한 다음 Identity Inspector (오른쪽 패널, 맨 위, ⌘-⌥-3을 누르십시오)에서 클래스를 변경하십시오. 펜촉에 서브 뷰도 만드십시오.

그런 다음 NSBundle에 너브를로드하십시오. 귀하의 사용자 정의보기는 initWithCoder:awakeFromNib이 될 것이므로 특정 하위보기를 찾으려면 계층 구조를 통해 뛰어 넘을 필요가 없습니다.

+0

감사합니다. 나는 그렇게 할 것이다! – SpaceDog