2011-02-13 3 views
1

메신저 코코아 개발에서 매우 새로운 기능이며 Window를로드하려고합니다. 나는 나의 문제를 설명 할 것이다.NSWindowController subClass - 초기화가 두 번 호출되었습니다

사용자는 내 cadastroContas 클래스는 다음과 같습니다 내 방 창문을

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

를로드 내가 다음 코드를 사용하여 메뉴 아이템 MenuItem을 클릭하면 :

@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"라는 두 개의 메시지를 받았는데 그 이유는 모르겠습니다. Exemple는 :

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

두 번째 메시지는 "[cadastroContasController SetMenuItem:sender];"쓸모를 할 수 있습니다.

그래서, 나는 [[cadastroContasController window] 항상 NULL(0x0)!를 반환 ..

또 다른 것은, 세드릭 이해하는 데 도움이 필요하지만, 내 컨트롤러 내부에 내가 (null가 아닌)를 처리 할 수 ​​있습니다.

답변

1

이것은 사용자가 self 포인터의 로깅에 표시된 것처럼 두 개의 인스턴스를 입력했음을 의미합니다. 값이 두 메시지 사이에 다릅니다.

계기에서 할당 계기를 사용하여 각 창 컨트롤러의 원인을 확인할 수 있습니다.

일반적으로이 문제는 펜촉과 코드에서 하나를 만들 때 발생합니다. 윈도우 컨트롤러의 경우, 코드에서 생성 한 것은 펜촉의 소유자 여야합니다. nib에 다른 윈도우 컨트롤러를 객체로 생성해서는 안됩니다.

또 다른 것은, [[cadastroContasController window] 항상 NULL(0x0)!를 반환하지만 내 컨트롤러 내부에 내가 (null가 아닌)를 처리 할 수 ​​있습니다.

window 콘센트를 창에 설정 한 창 콘트롤러가 nil을 반환하는 콘트롤러입니다. window 콘센트를 설정하지 않은 창 컨트롤러는 nil을 반환합니다.

위의 내용을 따르면 nib에서 만든 창 컨트롤러를 삭제 한 후 파일 소유자의 window 콘센트를 창에 연결해야합니다.

+0

안녕하세요, 피터 답변 해 주셔서 감사합니다. –

+0

안녕하세요, Peter 답변에 감사드립니다. 내 소스 코드를 조금 바꿨습니다. File Onwer가 이제는 'cadastroContas'유형입니다. 모든 Outlets를 File Onwer에 연결했습니다. (그래서, 내 ControllerClass에는 연결된 콘센트가 없습니다). 이제, 잘 동작하는 것으로 보인다. init는 두 번 호출되지만, dealloc 역시 두 번 호출된다 (그래서, 문제가 없다.). 당신이 펜촉에서 생성 한 윈도우 컨트롤러를 삭제했다. 너 더 설명해? 나는 당신이 무엇을 의미하는지 깨닫지 못한다. –

+0

@Fabio Araujo : 펜촉으로 만든 "cadastroContas". ("내 ControllerClass에는 연결된 콘센트가 없습니다."- 삭제해야하는 콘센트가 있습니다.) –

관련 문제