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