Subclase NSWindowController: Init se llama dos veces
-
13-11-2019 - |
Pregunta
Soy muy nuevo en el desarrollo de cacao y estoy intentando cargar una ventana.Te explicaré mi problema.
Cuando el usuario hace clic en el elemento del menú, uso el siguiente código para cargar mi ventana
if ( !cadastroContasController )
{
cadastroContasController = [[cadastroContas alloc]init];
[cadastroContasController SetMenuItem:sender];
}
if ( ![[cadastroContasController window] isVisible] )
{
NSLog(@"!isVisible");
[cadastroContasController showWindow:nil];
}
En mi clase catastroContas se ve así:
@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
y la implementación es
@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
Cuando hice clic en el menú, recibí dos mensajes "Init" y no sé por qué.Ejemplo:
[2223:a0f] Init self=0x10014fe40
[2223:a0f] Init self=0x10011f5a0
El segundo mensaje deja que el "[cadastroContasController SetMenuItem:sender];
" inútil.
Entonces, necesito ayuda para entender qué está pasando.
Otra cosa, [[cadastroContasController window]
siempre esta regresando NULL(0x0)
!!, pero dentro de mi controlador puedo manejarlo (no es nulo).
Solución
Esto significa que inició dos instancias, como lo muestra su registro del self
puntero:Observe que el valor es diferente entre los dos mensajes.
Puede usar el instrumento Asignaciones en Instrumentos para ver qué causó que se creara una instancia de cada controlador de ventana.
Por lo general, este problema ocurre cuando crea uno de estos en la plumilla y el otro en el código.En el caso de un controlador de ventana, el que cree en el código debe ser el propietario de su plumilla;no debes crear otro controlador de ventana como un objeto en la plumilla.
Otra cosa,
[[cadastroContasController window]
siempre esta regresandoNULL(0x0)
!!, pero dentro de mi controlador puedo manejarlo (no es nulo).
El controlador de ventana cuyo window
La salida que configuró en la ventana es la que regresa sinnil
.El controlador de ventana cuyo window
La salida que no configuraste es la que regresa. nil
.
Siguiendo lo que dije anteriormente, después de eliminar el controlador de ventana que creó en la plumilla, debe conectar el propietario de su archivo. window
salida a la ventana.