2011-05-20 126 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]; 
}