2016-04-19 1 views
2

J'ai une application simple de la barre de menu un fichier dans rapide:sélecteur Swift 2.2 NSMenuItem

import Cocoa 

class StatusBarApp : NSObject { 

    func buildMenu() { 
    let statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(NSVariableStatusItemLength) 
    statusItem.title = "StatusBarApp" 

    let menu = NSMenu() 

    let aboutMenuItem = NSMenuItem() 
    aboutMenuItem.title = "About" 
    aboutMenuItem.target = self 
    aboutMenuItem.action = #selector(about) 
    menu.addItem(aboutMenuItem) 

    statusItem.menu = menu 
    } 

    func about() { 
    print("XXX") 
    } 
} 

NSApplication.sharedApplication() 
StatusBarApp().buildMenu() 
NSApp.run() 

Je ne peux pas faire la barre de menu « A propos de » élément de connecté à la fonction à propos de(). Lorsque j'exécute l'application, l'élément "À propos" est désactivé. Comment faire passer le sélecteur à l'action de l'élément de menu dans Swift 2.2? Merci

Répondre

0

Le sélecteur est censé avoir un paramètre (l'instance NSMenuItem)

aboutMenuItem.action = #selector(StatusBarApp.about(_:)) 

... 

func about(sender : NSMenuItem) { 
    print("XXX") 
} 

Edit:

La solution consiste à exécuter l'application aussi complète application de cacao, y compris son délégué.
J'ai ajouté un deuxième élément de menu pour terminer l'application.

import Cocoa 

class StatusBarApp : NSObject, NSApplicationDelegate { 

    var statusItem : NSStatusItem! 

    func applicationDidFinishLaunching(aNotification: NSNotification) { 
    statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(NSVariableStatusItemLength) 
    statusItem.title = "StatusBarApp" 

    let menu = NSMenu() 

    let aboutMenuItem = NSMenuItem(title:"About", action:#selector(StatusBarApp.about(_:)), keyEquivalent:"") 
    aboutMenuItem.target = self 
    let quitMenuItem = NSMenuItem(title:"Quit", action:#selector(StatusBarApp.quit(_:)), keyEquivalent:"") 
    quitMenuItem.target = self 
    menu.addItem(aboutMenuItem) 
    menu.addItem(quitMenuItem) 

    statusItem.menu = menu 
    } 

    func about(sender : NSMenuItem) { 
    print("XXX") 
    } 

    func quit(sender : NSMenuItem) { 
    NSApp.terminate(self) 
    } 
} 

NSApplication.sharedApplication() 
let statusBarApp = StatusBarApp() 
NSApp.delegate = statusBarApp 
NSApp.run() 
+0

Merci, j'ai essayé ce changement, mais cela n'a eu aucun effet. L'article était toujours désactivé. Si je l'ai activé avec 'menu.autoenablesItems = false', la fonction about n'a pas été exécutée. – lutrekubej

+0

J'ai édité la réponse. Merci d'avoir signalé l'idée d'exécuter une application à partir d'un simple fichier Swift. – vadian

+0

Merci! J'ai été inspiré par ceci: http://czak.pl/2015/09/23/single-file-cocoa-app-with-swift.html – lutrekubej

0

action update

aboutMenuItem.action = Selector("about") 

et ajouter

aboutMenuItem.enabled = true 
+0

Merci, mais cela ne fonctionne pas. Il affiche un avertissement: 'avertissement: utilisez '#selector' au lieu de construire explicitement un 'Selector'' Mais plus important encore, l'élément est toujours désactivé, même après avoir ajouté' aboutMenuItem.enabled = true' – lutrekubej

+0

'aboutMenuItem.enabled = true' n'a aucun effet dans ce cas, car la validation implicite a une priorité plus élevée. – vadian

0

Considérez ceci:

import Cocoa 

class StatusBarApp : NSObject { 

    func buildMenu() { 
     let statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(NSVariableStatusItemLength) 
     statusItem.title = "StatusBarApp" 

     let menu = NSMenu() 

     let aboutMenuItem = NSMenuItem() 
     aboutMenuItem.title = "About" 
     aboutMenuItem.target = self 
     aboutMenuItem.action = #selector(about) 
     menu.addItem(aboutMenuItem) 

     statusItem.menu = menu 
    } 

    func about() { 
     print("XXX") 
    } 
} 


let app = StatusBarApp() 
NSApplication.sharedApplication() 
app.buildMenu() 
NSApp.run() 
+0

Merci, cela rend l'élément "About" activé, mais en cliquant dessus, il n'exécute pas la fonction about. – lutrekubej

+0

J'ai mis à jour la réponse. Cela fonctionne bien pour moi. Apparemment, la raison en est la gestion de la mémoire. J'ai enregistré deinit de l'objet StatusBarApp et identifié que l'objet d'application est immédiatement détruit dans votre cas. –

+0

Merci! J'ai déjà sélectionné une réponse différente avec une solution différente, mais cela fonctionne aussi. – lutrekubej