5

Estoy construyendo una aplicación Cocoa y tengo una pregunta sobre el uso de controladores de ventana. La idea es que si el usuario selecciona Nuevo desde la barra de menú, se crea una instancia de MyWindowController que es una subclase de NSWindowController y se visualiza una nueva ventana de MyWindow.xib.Liberar un NSWindowController cuando la ventana está cerrada

Estoy manejando la acción en el delegado de la aplicación. Por lo que he visto después de buscar algo como lo siguiente, podría hacerse. Una vez que se muestra la ventana, ya no tengo ningún motivo para guardar un puntero en el controlador de la ventana y, como lo asigné, también lo desbloqueo automáticamente antes de mostrar la ventana.

[[[[MyWindowController alloc] init] autorelease] showWindow:self]; 

Como la ventana se abre poco después, la ventana se mostrará brevemente en la pantalla y luego desaparecerá. Encontré una solución en la que retengo el controlador de ventana en el método -showWindow: y dejo que se libere una vez que recibe una notificación de ventanaWillClose.

- (IBAction)showWindow:(id)sender 
{ 
    [self retain]; 
    [[NSNotificationCenter defaultCenter] addObserverForName:NSWindowWillCloseNotification 
                 object:self.window 
                 queue:nil 
                usingBlock:^(NSNotification *note) { 
                 [self release]; 
                }]; 
    [super showWindow:sender]; 
} 

¿Hay una mejor manera de hacerlo? He buscado en la documentación de Apple y no he encontrado nada sobre qué prácticas usar. Suena como algo muy básico que debería cubrir, así que tal vez solo estoy buscando con los términos incorrectos.

Respuesta

5

Normalmente, debe mantener presionado el controlador de la ventana y solo liberarlo cuando haya terminado con él. Yo diría que su delegado de aplicaciones sería responsable de eso. Simplemente guárdelos en una matriz si puede haber múltiples. Si bien su solución puede funcionar, no es muy elegante.

Si está trabajando en una aplicación Cocoa basada en documentos, cree el controlador de ventana en su método de subcapa de documento makeWindowControllers y deje que esa clase mantenga un puntero al controlador de su ventana.

Cuestiones relacionadas