메신저 코코아 개발에서 매우 새로운 기능이며 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가 아닌)를 처리 할 수 있습니다.
안녕하세요, 피터 답변 해 주셔서 감사합니다. –
안녕하세요, Peter 답변에 감사드립니다. 내 소스 코드를 조금 바꿨습니다. File Onwer가 이제는 'cadastroContas'유형입니다. 모든 Outlets를 File Onwer에 연결했습니다. (그래서, 내 ControllerClass에는 연결된 콘센트가 없습니다). 이제, 잘 동작하는 것으로 보인다. init는 두 번 호출되지만, dealloc 역시 두 번 호출된다 (그래서, 문제가 없다.). 당신이 펜촉에서 생성 한 윈도우 컨트롤러를 삭제했다. 너 더 설명해? 나는 당신이 무엇을 의미하는지 깨닫지 못한다. –
@Fabio Araujo : 펜촉으로 만든 "cadastroContas". ("내 ControllerClass에는 연결된 콘센트가 없습니다."- 삭제해야하는 콘센트가 있습니다.) –