2016-06-09 1 views
0

J'ai un NSStatusItem avec un affichage personnalisé (TimeView), mais cela bloque le clic de l'affichage du NSMenu associé au NSStatusItem. Si je désactive la vue pour le NSStatusItem alors le menu s'affiche correctement, cependant, si je l'active alors rien ne se passe quand je clique sur la vue.Afficher le menu pour NSStatusItem avec vue

class AppDelegate: NSObject, NSApplicationDelegate { 

    @IBOutlet weak var statusMenu: NSMenu! 

    let statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(NSVariableStatusItemLength) 


    func applicationDidFinishLaunching(aNotification: NSNotification) { 
     statusItem.view = TimeView(statusItem: statusItem)//Commenting out this line provides the correct functionality for displaying the menu 
     statusItem.menu = statusMenu 
    } 

    func applicationWillTerminate(aNotification: NSNotification) { 
     // Insert code here to tear down your application 
    }  

} 

Un grand merci, Ben

Répondre

0

Je suis donc trouvé un moyen d'y parvenir. Vous pouvez utiliser NSStatusItem méthode popUpStatusItemMenu(menu: NSMenu) pour afficher le menu dans la méthode mouseDown(event: NSEvent) vues. Toutefois, ceci ne prend pas en compte la mise en évidence de NSStatusItem. Le moyen le plus simple que j'ai trouvé pour faire cela est de rendre la vue conforme à NSMenuDelegate et de la définir comme délégué de menu. Ensuite, vous pouvez remplacer les méthodes menuWillOpen(menu: NSMenu) et menuDidClose(menu: NSMenu) de la manière suivante:

func menuWillOpen(menu: NSMenu) { 
    drawHighlight(true) 
} 

func menuDidClose(menu: NSMenu) { 
    drawHighlight(false) 
} 

func drawHighlight(highlight:Bool) { 
    let image = NSImage(size: self.frame.size) 
    image.lockFocus() 
    statusItem.drawStatusBarBackgroundInRect(self.bounds, withHighlight: highlight) 
    image.unlockFocus() 
    self.layer?.contents = image 
}