2016-06-24 10 views
0

ich ein Dock-Menü in meinem Mac App über die Anwendung Delegatmethode implementiert haben:Hinzufügen von Elementen zum Dock-Menü von meinem View-Controller in meinem Cocoa App

func applicationDockMenu(sender: NSApplication) -> NSMenu? { 
     let newMenu = NSMenu(title: "MyMenu") 
     let newMenuItem = NSMenuItem(title: "Common Items", action: "selectDockMenuItem:", keyEquivalent: "") 
     newMenuItem.tag = 1 
     newMenu.addItem(newMenuItem) 
     return newMenu 

Gibt es eine Möglichkeit, ich Elemente der hinzufügen Menü innerhalb meines View-Controllers - Ich kann anscheinend keine Methode in meinem NSApplication-Objekt finden. Gibt es einen anderen Ort, an dem ich suchen sollte?

Antwort

1

Da applicationDockMenu: eine Delegate-Methode ist, würde eine Instanzmethode zum Hinzufügen von Menüelementen einen Konflikt mit der Delegate-Rückgabe verursachen.

Sie können das Dock-Menü zu einer Eigenschaft/Instanzvariable in Ihrer Anwendungsdelegiertenklasse machen. Auf diese Weise kann der View-Controller das Menü ändern, indem er entweder den Verweis auf das Menü von Ihrem Anwendungsdelegaten an den View-Controller übergibt (der eine dockMenu-Eigenschaft hätte) oder global referenziert (weniger empfohlen).

class AppDelegate: NSObject, NSApplicationDelegate { 
    @IBOutlet weak var window: NSWindow! 
    var dockMenu = NSMenu(title: "MyMenu") 

    func applicationDidFinishLaunching(aNotification: NSNotification) { 
     if let viewController = ViewController(nibName: "ViewController", bundle: nil) { 
      viewController.dockMenu = self.dockMenu 
      self.window.contentViewController = viewController 
     } 
    } 

    func applicationDockMenu(sender: NSApplication) -> NSMenu? { 
     return self.dockMenu 
    } 


class ViewController: NSViewController { 
    var dockMenu: NSMenu? 

    // Button action 
    @IBAction func updateDockMenu(sender: AnyObject) { 
     self.dockMenu?.addItem(NSMenuItem(title: "An Item", action: nil, keyEquivalent: "")) 
    } 
} 
+0

Wie mache ich das? Es scheint ein Fehler zu sein, wenn ich das versuche. Lassen Sie dockMenu = NSApplication.sharedApplication(). Delegate.dockMenu sagt, es gibt keine solche Eigenschaft, wenn ich die var docMenu = NSMenu() -Eigenschaft direkt nach dem Öffnen AppDelegate –

+0

ah vergessen habe, auf AppDelegate zu werfen. –

+1

Es klingt wie 'DockMenu' ist irgendwie nicht sichtbar. Ich habe einen Beispielcode hinzugefügt. Obwohl der Beispielcode die Übergabe von Eigenschaften zeigt, habe ich versucht, die 'NSApplication.sharedApplication()' Variante erfolgreich zu verwenden. –