Mac - Comment masquer par programmation NSApplicationActivationPolicyAccessory ou LSUIElement?

J'ai une petite application Cocoa basée sur Swift que j'écris. C'est une application à fenêtre unique, quelque chose comme Spotlight/QuickSilver/Alfred. Il est défini comme NSApplicationActivationPolicyAccessory ( docs ) (bien que j'aie essayé la même chose en utilisant LSUIElement , ce qui est équivalent). Il est activé via une touche de raccourci globale.

Tout fonctionne bien, sauf que quand il est actif, je ne peux pas cacher l'application en utilisant NSRunningApplication.currentApplication (). Hide() .

The docs for the hide method say "The property of this value will be NO if the application has already quit, or if of a type that is unable to be hidden." (emphasis mine), and I'm getting a NO back (though I'm actually using Swift, so I'm getting false).

Je peux comprendre pourquoi une application NSApplicationActivationPolicyProhibited ne pourrait pas être cachée, puisqu'elle n'est jamais active, mais il me semble que ce serait également le cas avec NSApplicationActivationPolicyAccessory .

J'ai essayé myWindow.orderOut (self); , mais cela masque juste la fenêtre sans cacher mon application et retourner le focus à l'application précédente.

Je stocke une référence à l'application précédemment active, donc si besoin est, je peux réactiver manuellement cette application, mais j'espère qu'il existe une méthode plus propre pour le faire.

0
@KenThomases C'est ce qu'il a fait! Merci! Pouvez-vous écrire ceci comme une réponse pour que je puisse la marquer comme la bonne?
ajouté l'auteur Matt, source
Avez-vous essayé NSApplication.sharedApplication (). Hide (nil) ? Normalement, on devrait adresser l'objet application (instance de NSApplication ) plutôt qu'une instance de NSRunningApplication pour fonctionner sur l'application en cours.
ajouté l'auteur Ken Thomases, source

2 Réponses

La solution manuelle consiste à stocker une référence à l'instance NSRunningApplication précédemment active (appelée previousActiveApplication ci-dessous), puis à l'activer lorsque vous souhaitez désactiver votre NSApplicationActivationPolicyAccessory application, comme ceci:

previouslyActiveApplication!.activateWithOptions(NSApplicationActivationOptions.ActivateIgnoringOtherApps);
0
ajouté

Utilisez NSApplication.sharedApplication (). Hide (nil) . Normalement, on devrait adresser l'objet application (instance de NSApplication ) plutôt qu'une instance de NSRunningApplication pour fonctionner sur l'application en cours.

0
ajouté
Swift 4: NSApplication.shared.hide (aucun)
ajouté l'auteur Repose, source