2010-08-18 15 views
7

Ho provato – windowDidExpose: ma non ha funzionato. Cosa devo provare per questo?Come posso tracciare l'evento di apertura e chiusura di NSWindow?

La mia finestra è una finestra di utilità.

- modificare per maggiore chiarezza -

Quello che voglio sono:

viewWillAppear viewWillDisappear viewDidLoad viewDidUnload

in Cocoa Touch.

+1

'windowDidExpose: 'è per una finestra che è già stata ordinata per essere rivelata da altre finestre b Eing ordinò dietro di esso. –

+0

Oh grazie per i chiarimenti. Era difficile sapere con solo la descrizione in riferimento. – Eonil

+0

La descrizione è migliore per la notifica che quel metodo corrisponde a: http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ApplicationKit/Classes/NSWindow_Class/Reference/Reference.html#//apple_ref/ c/data/NSWindowDidExposeNotification –

risposta

4

C'è windowDidClose:, ma probabilmente si riferisce solo alla chiusura; se stai inviando alla tua finestra un messaggio orderOut:, non penso che conti.

probabilmente è necessario o solo seguirlo da qualsiasi codice che stai ordinando la finestra dentro e fuori da, o sottoclasse di classe della finestra e sovrascrivere metodi come makeKeyAndOrderFront: e orderOut: (qualsiasi cosa tu stia utilizzando, almeno) per pubblicare notifiche personalizzate prima di chiamare fino a super.

+0

Nessun messaggio delegato per questo? È difficile da credere! Non sembra una buona idea la sottoclasse e l'override di tutti i metodi correlati perché non so quali metodi debbano essere sovrascritti per questo ... – Eonil

+0

Quindi il primo suggerimento: Tracciarlo da qualunque codice del tuo dice alla finestra di ordinare dentro o fuori . L'unico modo in cui poteva ordinare non con la mano sarebbe l'utente che lo chiudeva, e c'è "windowDidClose:" per quello. –

+0

OK, ho capito. Grazie ancora! – Eonil

0

Mi sono inventato un trucco per occuparsi di questo. Non c'è notifica che segnali che una finestra è stata messa sullo schermo, ma c'è una notifica che è praticamente garantita per inviata quando una finestra viene messa sullo schermo. Sto parlando di NSWindowDidUpdateNotification, che indica che una finestra si è aggiornata da sola.

Ovviamente, non è solo inviato quando viene visualizzata la finestra, viene inviata ogni volta che la finestra viene aggiornata. Inutile dire che questa notifica viene inviata un lotto più di una volta. Quindi vuoi guardarlo per la prima volta, fai le tue cose e ignora tutte le notifiche successive. Nel mio caso, volevo aggiungere un foglio a una finestra che un'altra parte della mia app avrebbe ordinato in seguito. Così ho fatto qualcosa di simile:

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

Non c'è alcun motivo particolare si dovrà utilizzare un osservatore osservatore metodo-based basata su blocchi avrebbe funzionato altrettanto bene.

5

Molto vecchia questione, ma solo a scopo di documentazione:


pista aperta: nel controller finestre override del metodo:

-(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... 
} 

fondo vicino: Implementare la metodo

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

Va bene non avere un parametro 'id' per l'osservatore delle notifiche? – Eonil

+0

non è sbagliato ma sì, se si desidera ricevere un oggetto, ad esempio la finestra di invio, è necessario modificare l'osservatore delle notifiche. – Kappe

0

Per Swift

pista aperta: Nel vostro controller finestre override del metodo:

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

fondo vicino: Implementare il metodo:

func windowWillClose() -> Void { 

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

Per Swift 4: 'NotificationCenter.default.addObserver (self, selettore: #selector (windowWillClose), nome: NSWindow.willCloseNotification, oggetto: finestra)' e '@objc func windowWillClose() -> Void { NotificationCenter .default.removeObserver (self) // Fai qui quello che vuoi .. } ' –

Problemi correlati