2016-08-08 63 views
1

Ich arbeite gerade an einem "Menüleiste" -Projekt und ich muss alle gemounteten Volumes in einem Untermenü in der Menüleiste App auflisten. Ich habe herausgefunden, wie drucken() alle aktivierten Volumes, aber ich muss mit dem Untermenü Hilfe (ohne .xib oder .storyboard Arbeit) Das ist mein „listVolumes func“Listet alle geladenen Volumes in einer Menüleiste auf Untermenü (nur programmgesteuert)

func listVolumes(sender: NSMenuItem) { 
    let keys = [NSURLVolumeNameKey, NSURLVolumeIsRemovableKey, NSURLVolumeIsEjectableKey] 
    let paths = NSFileManager().mountedVolumeURLsIncludingResourceValuesForKeys(keys, options: []) 
    if let urls = paths { 
     for url in urls { 
      if let components = url.pathComponents 
       where components.count > 1 
        && components[1] == "Volumes" { 
       print(url) 
      } 
     } 
    } 
} 

ein unter mein Code für die " Menüleiste app“

let statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(-2) 

func applicationDidFinishLaunching(aNotification: NSNotification) { 

    if let button = statusItem.button { 
     button.image = NSImage(named: "StatusBarButtonImage") 
    } 
    let menu = NSMenu() 

    menu.addItem(NSMenuItem(title: "Volumes", action: Selector("volumes:"), keyEquivalent: "")) 
    menu.addItem(NSMenuItem.separatorItem()) 
    menu.addItem(NSMenuItem(title: "Help", action: Selector("help:"), keyEquivalent: "")) 
    menu.addItem(NSMenuItem.separatorItem()) 
    menu.addItem(NSMenuItem(title: "Quit", action: Selector("terminate:"), keyEquivalent: "q")) 

    statusItem.menu = menu 

} 

so meine Frage ist, wie kann ich erstellen ein Untermenü, das alle eingebundenen Laufwerke enthält (programmatisch nur)

Antwort

1

Sie haben zum Beispiel ein Untermenü zum volumes Menüpunkt zu setzen

let volumesMenuItem = NSMenuItem(title: "Volumes", action: Selector("volumes:"), keyEquivalent: "") 
menu.addItem(volumesMenuItem) 
let volumesMenu = NSMenu(title: "Volumes") 
volumesMenuItem.submenu = volumesMenu 

Ich empfehle ein Array der Namen aus listVolumes() Funktion zurückkehren, dann können Sie Menüpunkte zu volumesMenuvolumes unter der Annahme enthält die Namen

for volumeName in volumes { 
    volumesMenu.addItem(NSMenuItem(title: volumeName, action: Selector("selectVolume"), keyEquivalent: "")) 
} 
+0

Dank hinzuzufügen! Aber wenn ich über das Array spreche, bekomme ich den Fehler "Type (NSMenuItem) ->() entspricht nicht dem Protokoll 'SequenceType' – IliasMay

+0

Ich habe das for in Array direkt über die 'let volumensMenuItem' Zeile gesetzt – IliasMay

+0

Sie können ' t eine Methode aus dem Ziel-/Aktionsmuster zurückgeben, den Workflow neu gestalten, um zum Beispiel die Menüpunkte in der 'listVolumes'-Funktion zu erstellen. Dann brauchen Sie eine Eigenschaft für die Submenvereferenz. – vadian