【问题标题】:Where can I declare my trigger for NSMenu?我在哪里可以声明我的 NSMenu 触发器?
【发布时间】:2021-08-04 16:08:57
【问题描述】:

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

class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate {


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

  }

我想将我的 NSMenu 的所有触发器保存在一个单独的类中:

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 的新手,学习它所基于的所有这些旧技术有点挑战。希望你能帮助我。

看起来是这样的:

【问题讨论】:

标签: swift macos nsmenu nsmenuitem


【解决方案1】:

你可以试试

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")
    }
    
}

【讨论】:

    【解决方案2】:

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

    action: #selector(test(_:))

    【讨论】:

      【解决方案3】:

      因为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")
          }
          
      }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-20
          • 1970-01-01
          • 1970-01-01
          • 2012-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多