2011-02-13 47 views
1

即時通訊非常新的可可開發中,我試圖加載一個窗口。 我會解釋我的問題。NSWindowController子類 - 初始化被調用兩次

當用戶單擊我使用下面的代碼的菜單項加載了我的窗前

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 

當菜單被點擊時,我收到兩條消息「初始化」,我不知道爲什麼。 例:

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

第二個消息讓 「[cadastroContasController SetMenuItem:sender];」 無用。

所以,我需要幫助明白怎麼回事..

另一件事,[[cadastroContasController window]總是返回NULL(0x0) !!,但我的控制器內我可以處理它(不是null)。

回答

1

這意味着你記錄了兩個實例,如記錄self指針所示:請注意兩個消息之間的值不同。

您可以使用樂器中的Allocations樂器來查看導致每個窗口控制器實例化的原因。

通常,當你在nib中創建其中一個並且在代碼中創建另一個時,會發生此問題。在窗口控制器的情況下,您在代碼中創建的應該是其筆尖的所有者;你不應該創建另一個窗口控制器作爲筆尖中的一個對象。

另一件事,[[cadastroContasController window]總是返回NULL(0x0) !!,但我的控制器內我可以處理它(不是null)。

您設置爲窗口的窗口控制器是返回非nil的窗口控件。您未設置的出口的窗口控制器是返回nil的窗口控制器。

根據我上面所說的,刪除在筆尖中創建的窗口控制器後,應該將文件所有者的出口連接到窗口。

+0

嗨,彼得謝謝你的回答。 – 2011-02-13 15:26:58

相關問題