2010-08-18 8 views
7

Lo intenté – windowDidExpose: pero no funcionó. ¿Qué debo probar para esto?¿Cómo puedo rastrear el evento de apertura y cierre de NSWindow?

Mi ventana es una ventana de utilidad.

- editar para mayor claridad -

Lo que quiero son:

viewWillAppear viewWillDisappear viewDidLoad viewDidUnload

en Cocoa Touch.

+1

'windowDidExpose: 'es para una ventana que ya está ordenada en ser revelada por otras ventanas b eing ordenado detrás de él. –

+0

Gracias por aclarar. Era difícil saber con solo una descripción en referencia. – Eonil

+0

La descripción es mejor para la notificación que corresponde a ese método: http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ApplicationKit/Classes/NSWindow_Class/Reference/Reference.html#//apple_ref/ c/data/NSWindowDidExposeNotification –

Respuesta

4

Hay windowDidClose:, pero eso probablemente solo se refiere al cierre; si está enviando su ventana un mensaje orderOut:, no creo que eso cuente.

es probable que tenga a bien acaba de encontrar que de cualquier código que está ordenando la ventana dentro y fuera de, o subclase de la clase de la ventana y reemplazar los métodos como makeKeyAndOrderFront: y orderOut: (lo que sea que estés utilizando, por lo menos) para publicar notificaciones personalizadas antes de llamar al super.

+0

¿Ningún mensaje de delegado para esto? ¡Es difícil de creer! Parece que no es una buena idea subclasificar y anular todos los métodos relacionados porque no estoy seguro de qué métodos se deben anular para esto ... – Eonil

+0

Por lo tanto, la primera sugerencia: Seguirla desde cualquier código que le indique a la ventana que ordene hacia adentro o hacia afuera . La única forma en que podría ordenar no con su mano sería que el usuario la cierre, y hay 'windowDidClose:' para eso. –

+0

Bien, entendí. ¡Gracias de nuevo! – Eonil

0

Se me ocurrió un truco para hacer frente a esto. No hay notificación de que señala que se ha puesto una ventana en la pantalla, pero hay una notificación que se garantiza que es enviada cuando se coloca una ventana en la pantalla. Estoy hablando de NSWindowDidUpdateNotification, que indica que una ventana se ha refrescado.

Por supuesto, no es solo enviado cuando aparece la ventana, se envía cada vez que se actualiza la ventana. Huelga decir que esta notificación se envía un lote más de una vez. Así que quiere verlo la primera vez, haga lo suyo e ignore cualquier notificación posterior. En mi caso, quería agregar una hoja a una ventana que otra parte de mi aplicación solicitaría más tarde. Así que hice algo como esto:

__block id observer = [NSNotificationCenter.defaultCenter addObserverForName:NSWindowDidUpdateNotification object:window queue:nil usingBlock:^(NSNotification *note) { 
    [self showSetupSheet]; 
    [NSNotificationCenter.defaultCenter removeObserver:observer]; 
}]; 

No hay ninguna razón particular, se tendría que usar un observador, un observador basado en el método basado en bloques funcionaría igual de bien.

5

muy vieja pregunta, pero sólo a modo de documentación:


pista abierta: En el controlador de ventanas reemplazar el método:

-(void)showWindow:(id)sender 
{ 
    //add this for track the window close 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(windowWillClose) 
               name:NSWindowWillCloseNotification 
               object:nil]; 
    [super showWindow:sender]; 
    //do here what you want... 
} 

pista estrecha: poner en práctica las método

-(void)windowWillClose 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    //do here what you want... 
} 
+0

¿Está bien no tener un parámetro 'id' para el observador de notificación? – Eonil

+0

no está mal, pero sí, si desea recibir un objeto, por ejemplo, la ventana de envío, debe cambiar su observador de notificación. Para – Kappe

0

Para Swift

pista abierta: En el controlador de ventanas reemplazar el método:

override func showWindow(sender: AnyObject?) { 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(windowWillClose), name: NSWindowWillCloseNotification, object: nil) 
    } 

pista estrecha: Poner en práctica el método:

func windowWillClose() -> Void { 

     NSNotificationCenter.defaultCenter().removeObserver(self); 
     //Do here what you want.. 
    } 
+0

Swift 4: 'NotificationCenter.default.addObserver (auto, el selector: #selector (windowWillClose), nombre: NSWindow.willCloseNotification, objeto: Ventana)' ' y @objc func windowWillClose() -> Void { NotificationCenter .default.removeObserver (self) // Haz lo que quieras .. } ' –

Cuestiones relacionadas