NSWindowController windowDidLoad no llama
-
01-10-2019 - |
Pregunta
Tengo una aplicación Cocoa simple usando una subclase NSWindowController. En la punta Tengo conjunto:
- clase del propietario del archivo a mi NSWindowController subclase
- La salida de 'ventana' del propietario del archivo a la NSWindow principal en la punta.
El método init de mi subclase NSWindowController se llama (que llamo súper), pero no importa que haga el windowDidLoad nunca es llamado.
Debo estar perdiendo algo obvio, pero para la vida de mí no puedo entender lo que es.
Solución
Usted está tratando de crear la instancia de NSWindowController
instanciándola en otra semilla. Sin embargo, cuando se instancia un objeto en un archivo semilla, se inicializa llamando -initWithCoder:
.
-initWithCoder:
no es un inicializador designado de NSWindowController
, por lo que la instancia de NSWindowController
en realidad nunca carga su plumín.
En lugar de crear instancias de la instancia NSWindowController
colocándolo en el archivo MainMenu.xib
en Interface Builder, crear mediante programación:
En AppDelegate.h :
@class YourWindowController;
@interface AppDelegate : NSObject
{
YourWindowController* winController;
}
@end
En AppDelegate.m :
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification*)notification
{
winController = [[YourWindowController alloc] init];
[winController showWindow:self];
}
- (void)dealloc
{
[winController release];
[super dealloc];
}
@end
En YourWindowController.m :
@implementation YourWindowController
- (id)init
{
self=[super initWithWindowNibName:@"YourWindowNibName"];
if(self)
{
//perform any initializations
}
return self;
}
@end
Otros consejos
Es perfectamente posible crear una instancia del controlador de ventana a través de una punta. En lugar de utilización windowDidLoad
como su gancho, en ese caso usted querrá usar awakeFromNib
.
La ventana puede ser cargado en la demanda - intente enviar window
a sí mismo en -init
. Ver la discusión de -[NSWindowController loadWindow]
en la documentación para obtener más información.
Si usted escribió
TTEst *test3 = (TTEst *)[[NSWindowController alloc] initWithWindowNibName:@"TTEst"];
tratar vez
TTEst *test3 = [[TTEst alloc] initWithWindowNibName:@"TTEst"];
que hace la diferencia! Por supuesto, la primera línea fue un error ...