2011-03-13 6 views
4

NIB에서 창을로드하는 데 NSWindowController을 사용하고 있습니다. 그러나 showWindow:으로 전화를 걸면 창은 시각적으로 최상위에 있지만 포커스는 새 창으로 이동하는 대신 원래 그대로 유지됩니다.NIB에서로드 된 NSWindow에 포커스를 두는 방법은 무엇입니까?

새 창을 만들기 전에 (cmd + n을 사용하여) 첫 번째 창 (키보드 포커스 사용)을 약간 움직이면 쉽게 알 수 있습니다. 결과는 다음과 같습니다.

하단의 초점이 맞춰진 창은 원래 창입니다. 상단에 초점이 맞지 않은 창은 새로 생성 된 창입니다.

이 관련 코드 :

AppDelegate.h :

- (IBAction)newDocument:(id) sender; 

AppDelegate.m :

- (IBAction)newDocument:(id) sender { 
    [[[FooController alloc] init] showWindow:self]; 
} 
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    [self newDocument:self]; 
} 

FooController.h :

@interface FooController : NSWindowController { } 
@end 

FooController.m :

- (id)init { 
    self = [super initWithWindowNibName:@"FooWindow"]; 
    return self; 
} 

FooWindow.xib : 변형없이
갓 만든 창 XIB.

MainMenu.xib :
창을 삭제 한 기본 MainMenu.xib입니다.

컨트롤러의 windowDidLoad 메서드에서 창에 makeKeyAndOrderFront:을 호출해도 새 창에 포커스가 나타나지 않습니다. FooWindow.xib의 파일 소유자를 FooController으로 설정하는 것도 도움이되지 않았습니다.

NIB에서 창을로드하여 표시하여 키보드 포커스를 수신하는 올바른 방법은 무엇입니까?

편집 : 그것은 아무것도하지 않는 window에 메소드를 호출하는 이유를 설명 NSWindowControllerwindow 방법 nil을 반환 것 같습니다. 그런데 왜 nil일까요?

답변

10

좋아하는 데 도움이됩니다.

xib의 파일 소유자가 컨트롤러로 설정되어 있어야하며 컨트롤러의 window 콘센트를 창 자체에 연결해야합니다 (이 부분은 내가 모르는 부분입니다).

그런 작업 만하면됩니다. No makeKeyWindow, makeMainWindow 또는 makeKeyAndOrderFront:이 필요합니다.

1

아마도 makeMainWindow : 또는 makeKeyWindow : 나는이 문제의 원인을 발견,

+0

'windowDidLoad'에서 호출하면 새 창에 포커스가 맞추어지지 않습니다. 다른 곳에서 전화해야합니까? – Zr40

+0

makeKeyAndOrderFront 다음에 호출해야한다고 생각합니다. – lbrndnr

+0

을 호출합니다. 이전에 시도한 것입니다. 'makeKeyAndOrderFront :','makeMainWindow'와'makeKeyWindow'를'windowDidLoad'에 넣었던 순서와 상관없이, 새 창은 포커스를 얻지 못합니다. – Zr40

관련 문제