2012-06-17 3 views
0

나는 Interface Builder에서 NSWindow을 설정했습니다. 클래스를 내 NSWindowController으로 설정하고 컨트롤러의 window 속성을 내 NSWindow에 연결했습니다. 내 컨트롤러는 NSWindowDelegate을 구현합니다. 수신 창 알림

- (void)windowDidLoad 
{ 
    [super windowDidLoad]; 

    [self.window setDelegate:self]; 
} 

- (void)windowDidBecomeMain:(NSNotification *)notification 
{ 
    NSLog(@"Did become main."); 
} 

은 여전히 ​​-windowDidBecomeMain:

를 호출되지 않습니다 :

지금, 내 컨트롤러에, 나는 다음과 같은 추가했습니다. 아무도 이것이 왜 있는지 압니까?

편집 :

발사에 AppDelegate에서 창을 보여주기 위해 노력. 메인 펜촉 (Info.plist에 선언 됨)에는 AppDelegate에 연결된 메뉴 항목 만 있습니다. 응용 프로그램 대리자에서 상태 표시 줄에 아이콘을 표시하고이 아이콘을 클릭하면 주 펜촉의 메뉴가 표시됩니다. 응용 프로그램 대리자에서 논리를 처리하도록 지정된 창 컨트롤러가 있어야하는 창을 표시하려고합니다. 이 기능이 작동하면 창 알림을 받게 될 것입니다.

이제 다음 코드는 창을 표시하지 않으며 그 이유를 파악할 수 없습니다.

DemoWindowController *dwc = [[DemoWindowController alloc] initWithWindowNibName:@"DemoWindowController"]; 
[dwc showWindow:self]; 

self은 응용 프로그램 대리인입니다.

+0

창 컨트롤러는 실제로 창을 여는 개체입니까? 그렇지 않으면 파일 소유자가 올바르게 설정되지 않습니다. –

+0

저는 Mac OS 개발에 익숙하지 않지만 몇 년 동안 iOS 개발을 해오 고 있습니다. 솔직히, 저는 윈도우 컨트롤러의 역할과 어플리케이션 위임자의 역할을 알아내는 데 어려움을 겪습니다. iOS 및 Mac OS에서 동일한 것은 아닙니다. AppDelegate에서 창 컨트롤러를 인스턴스화합니다. 이것이 내가 통지를받지 못하는 이유는 무엇인가? – simonbs

+0

응용 프로그램이 문서 기반 응용 프로그램입니까, 아니면 아닙니다? –

답변

0

귀하의 문제는 사실 귀하의 창 컨트롤러가 실제로 nibs 파일 소유자 인 개체로 인한 것 같습니다.

인터페이스 작성기에서 클래스를 변경하면 사용할 수있는 콘센트 및 작업이 무엇인지 알려주고 (이 때문에 Windows 콘센트로 드래그 할 수있는 이유가 있지만) 직접이 개체를 전달해야합니다.

비 문서 기반 응용 프로그램의 경우 NSApplicationMain을 호출하는 기본 메서드가 있습니다. 이것이 무엇인지는 기본적으로 info.plist 파일에 지정된 윈도우 펜촉을 조회하고 현재 NSApplication 인스턴스를이 nib에 파일 소유자로 넘깁니다 (클래스 유형을 NSWindowController으로 변경 했더라도 객체가 전달 됨). in은 실제로 NSApplication 유형 임).

문제를 해결하는 가장 쉬운 방법은 현재 (아직 실제로 아무 것도하지 않기 때문에) 현재 창 컨트롤러를 제거하는 것입니다.

응용 프로그램 대리인에 -windowDidBecomeMain: 메서드를 구현해야합니다. 그런 다음 Ctrl + 드래그하여 창에서 appDelegate로 드래그하여 창의 위임자로 설정하여 알림을받습니다.

업데이트

WindowController는 다음과 같은 두 가지 문제에주의에 대한 귀하의 질문에 대답하려면, 당신은 당신의 applicationDidFinishLaunching: 방법에 윈도우 컨트롤러 변수 (DWC)를 만드는

  1. . 이것은 당신이 창문을 가지고 그 방법을 떠나는 순간에 발표됩니다. 인스턴스 변수를 생성하여 대신 윈도우 컨트롤러에 유지하십시오.
  2. 두 번째 창 펜촉의 파일 소유자가 NSWindowController (또는 창 컨트롤러 유형)로 설정되어 있고 창 콘센트가 nib 파일의 창에 연결되어 있는지 확인하십시오.

이제 창이 표시됩니다.

+0

나는 올바른 길로 나를 안내했다고 생각합니다. 이 AppDelegate에서 창을 표시하여이 창을 시작시 표시하도록합니다. 나의 주요 펜촉 ('Info.plist'에서 선언)에는 메뉴 항목 만 있습니다. 새로운 nib 파일을 만들고이 창에 대한 논리를 처리하기 위해 창 컨트롤러를 추가하려고합니다. 내'AppDelegate'에서 나는 새로운 창을 보여 주려하지만 (내 원래의 질문을보십시오) 창은 나타나지 않습니다. 왜 이런 일이 발생했는지 알고 있습니까? 창을 표시 할 때 창 컨트롤러가 할당되어 창 알림을 받게됩니다. – simonbs

+0

로드 할 nib 파일을'WindowController'에게 말 했나요? 이를 수행하는 일반적인 방법은 nib 파일의 이름을 전달하는'- initWithWindowNibName :'을 호출하는 것입니다. –

+0

예, 펜촉의 이름을 전달했습니다. 내 원래 질문에 어떻게 창 컨트롤러를 초기화하고 어떻게 창을 표시하려고 표시합니다. – simonbs