为什么我的应用只能看到位于 AppDelegate 中的菜单项的选择器?

Why can my app only see selectors for menu items if they are in the AppDelegate?

我正在 Swift 构建我的第一个 macOs 应用程序。我已经设法将菜单 (NSMenu) 添加到菜单栏额外图标,但是当菜单加载时,每个菜单项都显示为已停用。我知道这是应用程序找不到菜单项的#selector 时的自动行为。

但问题是我 为每个菜单项设置了一个选择器。如果我将这些选择器的方法声明放在 AppDelegate 中,则菜单会很好地看到它们并将菜单项显示为已激活。但是,如果我将然后放在专用的 MenuManager class 中,那么它似乎根本看不到它们并将菜单项设置为停用。请注意,奇怪的是,编译器认为它们很好。如果没有,它将显示编译器错误。但是在运行时,菜单似乎无法找到这些方法,除非它们在 AppDelegate 中。

这是我声明菜单项的方式(在一个名为 BarIconMenu 的 class 子class NSMenu 中)

let short = NSMenuItem(
        title: "Short (20 words)",
        action: #selector(MenuManager.copyShortSnippetToClipboard),
        keyEquivalent: ""
    )

下面是 MenuManager 中定义该方法的方式 class

@objc func copyShortSnippetToClipboard() {
        clipboardManager.copyText(withLength: .short)
        ProgressHUD.showSuccessWithStatus("Copied to clipboard")
    }

我已经尝试了所有我能想到的方法,包括 1) 清理构建,2) 在 MenuManager class 前面附加 @objc,3) 在中初始化菜单MenuManager 而不是 AppDelegate - 但没有任何效果。

我不希望我的所有代码都存在于 AppDelegate 中,那么如何让我的菜单项选择器'see' 我需要它们调用的方法?

init 方法为方便起见设置了一些属性,但是 NSMenuItem class 还有其他几个属性。动作选择器将设置要调用的方法,但目标是消息实际发送到的对象,因此您可以根据需要设置 menuItem 的目标(否则 AppDelegate 通常会成为默认值)。