2012-08-16 2 views
3

어떻게합니까? 간단히 창을로드하고 기본 창 앞에 표시하기 만하면됩니다.NSWindow를 별도의 펜촉으로 표시하십시오 (모달 아님)

NSWindowController* controller = [[NSWindowController alloc] initWithWindowNibName: @"MyWindow"]; 
NSWindow* myWindow = [controller window]; 
[myWindow makeKeyAndOrderFront: nil]; 

이 코드는 잠시 동안 창을 표시 한 다음 숨 깁니다. IMHO 이것은 내가 창에 대한 참조를 유지하지 않기 때문이다 (나는 ARC를 사용한다). [NSApp runModalForWindow: myWindow];은 완벽하게 작동하지만 모달로 표시 할 필요는 없습니다.

답변

6

그렇습니다. ARC를 사용하면 창에 대한 참조를 보유하지 않은 경우 즉시 루틴을 종료 할 때 철거됩니다. 아이바 (ivar)에서 강력한 참조를 유지해야합니다. [NSApp runModalForWindow: myWindow]은 모달로 실행되는 동안 NSApplication 개체가 창에 대한 참조를 보유하기 때문에 다릅니다.

.H :

@class MDWindowController; 
@interface MDAppDelegate : NSObject <NSApplicationDelegate> { 
    __weak IBOutlet NSWindow  *window; 
    MDWindowController    *windowController; 
} 
@property (weak) IBOutlet NSWindow *window; 
@property (strong) MDWindowController *windowController; 

- (IBAction)showSecondWindow:(id)sender; 
@end 

하는 .m :

#import "MDAppDelegate.h" 
#import "MDWindowController.h" 

@implementation MDAppDelegate 

@synthesize window; 
@synthesize windowController; 

- (IBAction)showSecondWindow:(id)sender { 
    if (windowController == nil) windowController = 
         [[MDWindowController alloc] init]; 
    [windowController showWindow:nil]; 
} 

@end 

1

당신은 가능성이 사용자가 만드는 NSWindowController 인스턴스에 strong 참조를 생성 다음에 비슷한 일을해야 makeKeyAndOrderFront: 메소드를 NSWindowControllerNSWindow에 직접 보내지 않고 y ou는 NSWindowController에 내장 된 showWindow: 메서드를 사용할 수 있습니다. 위의 코드 (아래 샘플 프로젝트) NSWindowController의 사용자 지정 하위 클래스를 사용하는 반면

, 당신은 또한 일반적인 NSWindowController를 사용하고 initWithWindowNibName:을 사용하여 인스턴스를 생성 (단지 nib 파일의 파일의 소유자가보다는 NSWindowController로 설정되어 있는지 확인 MDWindowController과 같은 사용자 정의 하위 클래스).

샘플 프로젝트 :

http://www.markdouma.com/developer/MDWindowController.zip

관련 문제