NSWindowController subClass - Init被调用两次

时间:2011-02-13 01:45:43

标签: cocoa nswindowcontroller

我在可可开发方面非常新,我正在尝试加载一个Window。 我会解释我的问题。

当用户点击menuItem时,我使用以下代码加载我的窗口

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 个答案:

答案 0 :(得分:1)

这意味着你输入了两个实例,如self指针的记录所示:注意两条消息的值不同。

您可以使用Instruments中的Allocations工具查看导致每个窗口控制器被实例化的原因。

通常,当您在nib中创建其中一个而在代码中创建另一个时会发生此问题。对于窗口控制器,您在代码中创建的窗口控制器应该是其笔尖的所有者;你不应该在笔尖中创建另一个窗口控制器作为对象。

  

另一件事,[[cadastroContasController window]总是返回NULL(0x0) !!,但在我的控制器中我可以处理它(它不是空的)。

您设置到窗口的window出口的窗口控制器是返回非nil的窗口控制器。未设置window出口的窗口控制器是返回nil的出口。

根据我上面所说的,删除你在笔尖中创建的窗口控制器后,你应该将文件所有者的window插座连接到窗口。