2012-08-16 37 views
3

如何做到這一點?我只是想加載一個窗口並在主窗口前顯示它。顯示NSWindow從單獨的筆尖(非模式)

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

此代碼顯示一段時間的窗口,然後隱藏它。恕我直言,這是因爲我不參考窗口(我使用ARC)。 [NSApp runModalForWindow: myWindow];完美地工作,但我不需要模態地顯示它。

回答

6

是的,用ARC如果你沒有提及窗口,只要你退出你的程序,它就會被拆除。你需要在伊娃裏堅持引用它。 [NSApp runModalForWindow: myWindow]是不同的,因爲NSApplication對象持有對窗口的引用,只要它是以模態方式運行。

1

你應該做很可能類似於以下,這將創建一個strong參考創建NSWindowController實例的東西:

.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 

請注意,不是將makeKeyAndOrderFront:方法直接發送到NSWindowControllerNSWindow,而是將y您可以使用NSWindowController的內置showWindow:方法。

雖然上面的代碼(以下示例項目)使用的NSWindowController自定義子類,你也可以使用一個通用的NSWindowController,並使用initWithWindowNibName:實例(只需確保筆尖文件的文件的所有者設置爲NSWindowController,而不是像MDWindowController這樣的自定義子類)。

示例項目:

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