NSWindowController subClass - Init вызывается дважды - PullRequest
2 голосов
/ 13 февраля 2011

Я очень новичок в разработке какао, и я пытаюсь загрузить окно.Я объясню свою проблему.

Когда пользователь щелкает пункт меню, я использую следующий код для загрузки своего окна

if ( !cadastroContasController )
{
    cadastroContasController = [[cadastroContas alloc]init];
    [cadastroContasController SetMenuItem:sender];
}
if ( ![[cadastroContasController window] isVisible] )
{
    NSLog(@"!isVisible");
    [cadastroContasController showWindow:nil];
}

Я мой класс cadastroContas выглядит следующим образом:

@interface cadastroContas : NSWindowController 
{
    NSMenuItem *mnuCommand;
    IBOutlet NSComboBox *cmbSelecao;
    IBOutlet NSTextField *txtNome;
    IBOutlet NSTextField *txtSaldoInicial;
    IBOutlet NSTextField *txtAnotacoes;
}


- (void)windowDidBecomeKey:(NSNotification *)notification;
- (BOOL)windowShouldClose:(id)sender;
- (void)windowWillClose:(NSNotification *)notification;
- (void)SetMenuItem:(NSMenuItem*) menu;
- (NSMenuItem*) MenuItem;

@end

, а реализация -

@implementation cadastroContas

-(void)windowDidLoad
{
NSLog(@"windowDidLoad");
[mnuCommand setState:NSOnState];
}

-(id)init
{
    self = [super initWithWindowNibName:@"cadastroContas"];
NSLog(@"Init self=%p", self);
return self;
}
-(void)dealloc
{
NSLog(@"Dealoc=%p", self);
[super dealloc];
}

- (void)windowDidBecomeKey:(NSNotification *)notification
{
NSLog(@"windowDidBecomeKey window=%p", [self window]);
}

- (BOOL)windowShouldClose:(id)sender
{
NSLog(@"windowShouldClose Window=%p", [self window]);
NSLog(@"mnuComando=%p GetMenuItem=%p", mnuCommand, [self MenuItem] );
if ( mnuCommand )
{
    [mnuCommand setState:NSOffState];
}
return YES;
}

- (void)windowWillClose:(NSNotification *)notification
{

NSLog(@"windowWillClose  Window=%p", [self window]);
NSLog(@"mnuCommand=%p GetMenuItem=%p", mnuCommand, [self MenuItem] );   
[self dealloc];
}

- (void)SetMenuItem:(NSMenuItem*) menu
{
mnuCommand = menu;
}

- (NSMenuItem*) MenuItem
{
    return mnuCommand;
}

@end

Когда я щелкнул по меню, я получил два сообщения «Init» и не знаю почему.Пример:

[2223:a0f] Init self=0x10014fe40
[2223:a0f] Init self=0x10011f5a0

Второе сообщение делает бесполезным "[cadastroContasController SetMenuItem:sender];".

Итак, мне нужна помощь, чтобы понять, что происходит ..

Еще одна вещь,[[cadastroContasController window] всегда возвращает NULL(0x0) !!, но внутри моего контроллера я могу справиться (это не ноль).

1 Ответ

1 голос
/ 13 февраля 2011

Это означает, что вы инициировали два экземпляра, как показано в журнале указателя self: обратите внимание, что значение отличается в двух сообщениях.

Вы можете использовать инструмент Распределения в Инструментах, чтобы увидеть, чтовызывал создание каждого оконного контроллера.

Обычно эта проблема возникает, когда вы создаете один из них в кончике, а другой в коде.В случае оконного контроллера тот, который вы создаете в коде, должен быть владельцем его пера;Вы не должны создавать другой оконный контроллер как объект в перо.

Другое дело, [[cadastroContasController window] всегда возвращает NULL(0x0) !!, но внутри моего контроллера я могу справиться с этим (это не так)t null).

Контроллер окна, выход которого window, который вы установили для окна, является тем, который возвращает не-nil.Контроллер окна, у которого window розетка, которую вы не установили, возвращает nil.

. После того, как я сказал выше, после удаления контроллера окна, который вы создали в перо, вы должны подключитьсяwindow выход владельца вашего файла в окно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...