2012-08-01 3 views
1

Apple의 documentation에 따르면 NSWindowController 하위 클래스를 초기화하는 권장 방법은 initWithWindowNibName()이 아니라 init()을 호출하는 것입니다. 이 문서는 NSWindowController가 원래 설계된 펜으로 만 작동 할 가능성이 높으므로 서브 클래스에서 super initWithWindowNibName을 호출하게하고, initWithWindowNib ... 메소드 중 하나가 존재하면 서브 클래스가 오류를 기록해야한다고 말합니다 라는.NSWindowController 하위 클래스 초기화

- (id) init 
{ 
    NSLog(@"init()"); 
    return [super initWithWindowNibName:@"MyDocument"]; 
} 

- (id) initWithWindowNibName:(NSString *)windowNibName 
{ 
    NSLog(@"error...use init() instead"); 
    return nil; 
} 

- (id) initWithWindowNibName:(NSString *)windowNibName owner:(id)owner 
{ 
    NSLog(@"error...use init() instead"); 
    return nil; 
} 

- (id) initWithWindowNibPath:(NSString *)windowNibPath owner:(id)owner 
{ 
    NSLog(@"error...use init() instead"); 
    return nil; 
} 

가 실행되면, 내가 출력으로 다음을 참조하십시오 : 그래서

init() 
error...use init() instead 

... 응

그래서이 내가 쓴 무엇인가? 무슨 일이야?

두 번째로 호출되는 init()에 대한 stackoverflow question이 있습니다. 하나의 인스턴스가 코드를 통해 생성되고 다른 하나는 펜촉을 통해 생성됩니다. 내 펜촉에는 컨트롤러 객체가 전혀 없습니다.

답변

2

문제는 [super initWithWindowNibName:@"MyDocument"]은 단지 편리한 방법 일뿐입니다. 그냥 [self initWithWindowNibName:@"MyDocument" owner:self]으로 전화하면됩니다. 이것은 물론 오류 메시지를 던집니다. init 방법을

- (id) init 
{ 
    NSLog(@"init()"); 
    return [super initWithWindowNibName:@"MyDocument" owner:self]; 
} 
으로 변경하면 문제를 해결할 수 있습니다.