2011-05-20 125 views
1

我有一個NSDocument子類與兩個NSWindowControllers對應於2個不同的xib。NSWindowController不在init中隱藏其窗口?

繼基於文檔的應用指南我已經加入我的document.m執行以下

- (void)makeWindowControllers 
{ 
    NSLog(@"in MakeWindowControllers"); 

    MainWindowController *mainWindowController = [[MainWindowController alloc] init]; 
    [mainWindowController autorelease]; 
    [self addWindowController:mainWindowController]; 

    csvWindowController = [[CSVWindowController alloc] init]; 
    [csvWindowController autorelease]; 
    [self addWindowController:csvWindowController];   
} 

問題是,我想第二個窗口控制器csvWindowController最初隱藏其窗口,我會表現出同樣的實例稍後的窗口。這樣做我寫了:

@implementation CSVWindowController 


- (id) init { 

    if (! (self = [super initWithWindowNibName:@"CSVWindow"])) { 

     NSLog(@"CSVWindowController init failed"); 
     return nil; 
    } 

    window = [self window]; 
    NSLog(@"CSVWindowController init"); 

    [window orderOut:nil]; // to hide it 
    NSLog(@"CSVWindowController hiding the window"); 

    return self; 
} 

但窗口在那裏,顯示出來。

請不是我有VisibleAtLaunch沒有被標記,該控制檯它正確地顯示我的郵件,即使我改變:

 [window orderOut:nil]; // to hide it 
to 
     [window orderOut:self]; // to hide it 

結果顯示出來一樣,窗口。

任何幫助表示讚賞,感謝:)

回答

1

好吧,我再回答我自己的問題,但這次與好評。我認爲我做錯的事情與默認文檔應用程序模板的基於文檔的體系結構的隱藏 - 對我來說有關。

我試圖與一個不同的方法,從頭開始創建不下垂「基於文檔的應用程序」的應用程序,併爲它提供:

  • 1 NSDocument子類
  • 2 NSWindowControllers子類
  • 1的MainMenu的.xib
  • 2 window.xib

和我已經迫使所述N個的實例化SwindowController在MyDocument代碼中的子類。

我也在MyDocument中放置了MenuItems的IBActions,並且我已經將MyDocument對象綁定到了MainMenu.xib中的MenuItems。

這次我可以做任何事情,隱藏/顯示以一個隱藏的窗口開始的窗口,而不是自動啓用菜單項。

下面是代碼,對於像我這樣的未來可能要與之鬥爭的新手來說。

// MyDocument.h 
#import <Cocoa/Cocoa.h> 
#import "testWindowController.h" 
#import "test2WindowController.h" 

@interface MyDocument : NSDocument { 
    testWindowController *test; 
    test2WindowController *test2; 

} 

- (IBAction)showWindow1:(id)pId; 
- (IBAction)showWindow2:(id)pId; 
- (IBAction)hideWindow1:(id)pId; 
- (IBAction)hideWindow2:(id)pId; 

@end 


// MyDocument.m 
#import "MyDocument.h" 
#import "testWindowController.h" 
#import "test2WindowController.h" 

@implementation MyDocument 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     // Initialization code here. 
     NSLog(@"MyDocument init..."); 
     [self makeWindowControllers]; 
    } 

    return self; 
} 

- (void)dealloc 
{ 
    [super dealloc]; 
} 

- (void)makeWindowControllers 
{ 

    test = [[testWindowController alloc] init]; 
    test2 = [[test2WindowController alloc] init]; 

    [self addWindowController:test]; 
    [self addWindowController:test2]; 

    // start hiding the first window 
    [[test window] orderOut:self]; 
} 

- (IBAction)hideWindow1:(id)pId 
{ 
    NSLog(@"hideWindow1"); 
    [[test window] orderOut:self]; 
} 

- (IBAction)showWindow1:(id)pId 
{ 
    NSLog(@"showWindow1"); 
    [test showWindow:self]; 
    [[test window] makeKeyAndOrderFront:nil]; // to show it 
} 

- (IBAction)hideWindow2:(id)pId 
{ 
    NSLog(@"hideWindow2"); 
    [[test2 window] orderOut:self]; 
} 

- (IBAction)showWindow2:(id)pId 
{ 
    NSLog(@"showWindow2"); 
    [test2 showWindow:self]; 
    [[test2 window] makeKeyAndOrderFront:nil]; // to show it 
} 


-(BOOL)validateMenuItem:(NSMenuItem *)menuItem { 

    NSLog(@"in validateMenuItem for item: %@", [menuItem title]); 

    if ([[menuItem title] isEqualToString:@"Show Window"] 
     && [[test window] isVisible]){ 
     return NO; 
    } 

    if ([[menuItem title] isEqualToString:@"Hide Window"] 
     && ![[test window] isVisible]){ 
     return NO; 
    } 

    if ([[menuItem title] isEqualToString:@"Show Window2"] 
     && [[test2 window] isVisible]){ 
     return NO; 
    } 

    if ([[menuItem title] isEqualToString:@"Hide Window2"] 
     && ![[test2 window] isVisible]){ 
     return NO; 
    } 
    return [super validateMenuItem:menuItem]; 
}