NSWindowController не скрывает свое окно при инициализации?

У меня есть подкласс NSDocument с двумя NSWindowControllers, соответствующими двум разным xib.

Следуя Руководству по применению на основе документов, я добавил следующее в свою реализацию 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

Результат тот же, появляется окно.

Любая помощь приветствуется, спасибо :)


person Fabrizio Prosperi    schedule 20.05.2011    source источник


Ответы (1)


Хорошо, я снова отвечаю на свой вопрос, но на этот раз с положительным замечанием. Я думаю, что то, что я делал неправильно, имело какое-то отношение к скрытым для меня последствиям основанной на документах архитектуры стандартного шаблона приложения для документов.

Я попытался использовать другой подход, создав приложение с нуля, НЕ пометив «Приложение на основе документов» и предоставив ему:

  • 1 подкласс NSDocument
  • 2 подкласса NSWindowControllers
  • 1 MainMenu.xib
  • 2 окна.xib

и я принудительно создал экземпляры подклассов NSWindowController в коде MyDocument.

Я также поместил IBActions для элементов меню в MyDocument и привязал объект MyDocument к элементам меню в MainMenu.xib.

На этот раз я мог делать все, что угодно, скрывать/показывать окна, начинающиеся с одного скрытого, и автоматически включать элементы меню по желанию.

Ниже следует код для любого новичка вроде меня, которому, возможно, придется бороться с этим в будущем.

//  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];
 }
person Fabrizio Prosperi    schedule 22.05.2011