2014-06-06 12 views
8

Sto sviluppando un app su MacOS X con Xcode5.1viewWillAppear o viewDidAppear su NSWindowController

e c'è un'azione che voglio far scattare ogni volta che l'utente apre o mostra un NSWindowController tutto quello che ho trovato era

  • windowDidLoad
  • windowWillLoad
  • awakeFromNib

ma niente come in iOS: i miei metodi ...

  • viewWillAppear
  • viewDidAppear

perché anche se chiudo un NSWindowController con

[NSWindowController chiudi];

se apro di nuovo, non innesca le mie azioni da windowDidLoad, windowDidAppear o awakeFromNib

e ora ho bisogno di qualcosa di simile a loro, qual è l'equivalente, deve essere qualcosa

grazie in anticipo per il supporto

risposta

14

Sì, non esistono metodi convenienti in NSWindowController. Lasciami spiegare perché.
C'è una differenza tra il controller di visualizzazione iOS e il controller di finestra OS X: in iOS, il controller di visualizzazione può essere visualizzato a schermo intero o completamente nascosto dallo schermo. È tutto. La finestra di OS X ha molti più gradi di libertà: può essere mostrata, nascosta, ridimensionata, ridotta a icona/ripristinata, sovrapposta alle finestre di altre app, visualizzata a schermo intero, passare a un'altra schermata (in configurazione multimonitor), ecc. questa attività, NSWindow ha un delegato (che viene automaticamente mappato sul NSWindowController corrispondente in xib). Dai uno sguardo ai documenti NSWindowDelegate. Quindi non esiste una mappatura comportamentale diretta tra iOS "appear" e il gruppo di azioni OS X. Ma possiamo provare ad usare gli eventi più vicini possibili.

Per il tuo caso (fare qualcosa alla finestra diventa visibile), posso offrire 2 metodi diversi.
In primo luogo, ignorare l'azione showWindow nella sottoclasse NSWindowController:

- (IBAction)showWindow:(id)sender 
{ 
    [super showWindow:sender]; 

    // your code here 
} 

In questo modo, il codice verrà chiamato viene creato ogni finestra di tempo/mostrata sullo schermo.

o seconda, utilizzare il metodo delegato:

- (void)windowDidChangeOcclusionState:(NSNotification *)notification 
{ 
    // notification.object is the window that changed its state. 
    // It's safe to use self.window instead if you don't assign one delegate to many windows 
    NSWindow *window = notification.object; 

    // check occlusion binary flag 
    if (window.occlusionState & NSWindowOcclusionStateVisible) 
    { 
     // your code here 
    } 
} 

In questo modo, il codice verrà chiamato ogni volta quando la finestra (o è parte) diventerà visibile. Ad esempio, questo evento può verificarsi se l'utente ha ridotto a icona l'altra finestra che si trovava sopra la finestra (o spostata da qualche parte).È normale quando si desidera sospendere animazioni/timer/etc in una finestra invisibile per salvare alcune CPU :)
È anche un metodo molto utile se si deve fare qualcosa sulla finestra scompare (ad esempio, la finestra con flag abilitato hidesOnDeactivate è non chiuso e non chiama i metodi di delega corrispondenti, ma solo rimosso dalla schermata senza chiudere). Questo metodo ci consente di tenere traccia di tali situazioni:

- (void)windowDidChangeOcclusionState:(NSNotification *)notification 
{ 
    if (self.window.occlusionState & NSWindowOcclusionStateVisible) 
    { 
     // Appear code here 
    } 
    else 
    { 
     // Disappear code here 
    } 
} 
Problemi correlati