我在哪里可以声明我的 NSMenu 触发器?

Where can I declare my trigger for NSMenu?

我在 AppDelegate 中手动创建了一个 NSMenu,如下所示:

class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate {


  func applicationDidFinishLaunching(_ notification: Notification) {
        
    rightClickMenu = RightClickMenu.createMenu();

  }

而且我想将我的 NSMenu 的所有触发器保留在一个单独的 Class 中,就像这样:

class RightClickMenu {
    static func createMenu() -> NSMenu {
        let menu = NSMenu(title: "Status Bar Menu")
         menu.addItem(
            withTitle: "Test",
            action: #selector(RightClickMenu.test(_:)),
            keyEquivalent: "")

        return menu

    }
    
    //This func never gets triggered and menu item is grey
    @objc func test(_ sender: Any?){
        print("Test")
    }
    
}

我觉得跟函数声明的位置有关系。至少我知道它在 AppDelegate 中有效,但为什么在这里不起作用?根本找不到解释这个生命周期的好资源...

我来自 SwiftUI 背景,我是 Swift 的新手,学习它所基于的所有这些旧技术有点挑战。希望你能帮助我。

这是它的样子:

您将选择器中的方法表示为静态函数(通过在 class 上引用它)。改成

action: #selector(test(_:))

你可以试试

let eventHud = RightClickMenu()

class RightClickMenu {

    static func createMenu() -> NSMenu {
        let menu = NSMenu(title: "Status Bar Menu")
        let item = NSMenuItem(title: "Test", action:  #selector(RightClickMenu.test(_:)), keyEquivalent: "")
        item.target = eventHud
        menu.addItem(item)
        return menu
    }
    
    
    @objc func test(_ sender: Any?){
        print("Test")
    }
    
}

因为RightClickMenu只是某样板,

最好修改为

extension NSMenu{

    static func createMenu() -> NSMenu {
        let menu = NSMenu(title: "Status Bar Menu")
        let item = NSMenuItem(title: "Test", action:  #selector(NSMenu.test(_:)), keyEquivalent: "")
        item.target = menu
        menu.addItem(item)
        return menu
    }
    
   
    @objc func test(_ sender: Any?){
        print("Test")
    }
    
}

我对此的回答是使用带有 AppDelegate 的 SwiftUI 默认项目中的故事板 NSMenu。这很完美,所以我推荐这个作为解决方案。