2017-02-25 7 views
0

J'ai une application qui affiche une vue personnalisée dans la barre de menu de macOS. Lorsque l'utilisateur clique sur l'affichage personnalisé, je souhaite afficher un menu contextuel (NSMenu).Menu Bar Extra n'ouvrant pas sur le clic gauche

Mon code ressemble à ceci:.

privée laisser statusItem = NSStatusBar.system() statusItem (withLength: NSVariableStatusItemLength) timer private var: minuterie? private var Voir: MenuView! private var menu: NSMenu! privé let popover = NSPopover() privé var popoverController: PopoverViewController?

func applicationDidFinishLaunching(_ aNotification: Notification) 
{ 
    self.view = createView() 
    self.statusItem.view = self.view 

    self.menu = NSMenu() 
    self.menu.addItem(NSMenuItem(title: "Quit", action: nil, keyEquivalent: "")) 
    self.statusItem.menu = self.menu 

    self.statusItem.menu = menu 
} 

Cependant, lorsque je clique sur la vue, le menu n'apparaît pas comme j'attendre (bien, il ne figure pas du tout). Lorsque je n'utilise pas ma vue personnalisée et ne configure qu'une image, le menu contextuel s'ouvre lorsque je clique dessus. Comment puis-je afficher le menu lors de l'utilisation d'une vue personnalisée?

Cordialement, Sascha

Répondre

1

Si vous utilisez une vue personnalisée que vous êtes responsable de gérer tous les événements, le dessin et la mise en valeur.

Dans la méthode init(frame:), passez l'instance NSStatusBar. Affectez le menu à la vue plutôt qu'à statusItem.

Au moins vous avez à passer outre mouseDown

override func mouseDown(with theEvent: NSEvent) { 
    statusItem.popUpMenu(menu!) 
    needsDisplay = true 
} 
+0

Merci vous pour l'astuce, je me suis rendu avec une approche légèrement différente. J'ai toujours attribué le menu à l'élément d'état. Lorsque la vue a été cliquée, une notification est envoyée, puis traitée dans AppDelegate. Ici, la fonction popUpMenu est appelée. Je vous remercie. –

+1

Il vous est déconseillé d'envoyer des notifications à 'Appdelegate' car l'instance est directement accessible de partout (' NSApp.delegate'). Utilisez les notifications uniquement s'il y a plusieurs récepteurs ou si les vues/contrôleurs ne sont pas liés entre eux. En outre, je recommande de garder la logique concernant la vue toujours ** dans ** la vue. – vadian

+0

Ok, je vais le changer ensuite, merci encore. Je ne savais pas sur l'accès NSApp.delegate. –