我正在Swift中构建我的第一个macOs应用。我设法将菜单(NSMenu)添加到“菜单栏附加”图标,但是当菜单加载时,每个菜单项都显示为停用。我知道当应用程序找不到菜单项的#selector时,这是自动行为。
但是问题是我do每个菜单项都有一个选择器。如果我将这些选择器的方法声明放在AppDelegate中,则菜单会很好地看到它们,并显示已激活的菜单项。但是,如果我将其放在专用的MenuManager
类中,则似乎根本看不到它们,并将菜单项设置为停用。注意,奇怪的是,编译器认为它们很好。如果没有,它将显示编译器错误。但是在运行时,菜单似乎无法找到这些方法,除非它们位于AppDelegate中。
这里是我声明菜单项的方式(在名为BarIconMenu的类中,该类继承NSMenu的类)
let short = NSMenuItem(
title: "Short (20 words)",
action: #selector(MenuManager.copyShortSnippetToClipboard),
keyEquivalent: ""
)
这是在MenuManager类中定义该方法的方式
@objc func copyShortSnippetToClipboard() {
clipboardManager.copyText(withLength: .short)
ProgressHUD.showSuccessWithStatus("Copied to clipboard")
}
我已经尝试过我能想到的所有方法,包括1)清理构建,2)在@objc
类的前面附加MenuManager
,3)在MenuManager中代替AppDelegate初始化菜单-但没有任何作用。
我不希望我的所有代码都驻留在AppDelegate中,因此如何使菜单项选择器“查看”我需要它们调用的方法?
为了方便起见,init方法设置了一些属性,但是NSMenuItem类还有其他一些属性。一个操作选择器将设置要调用的方法,但是目标是消息实际发送到的对象,因此您可以根据需要设置menuItem的目标(否则,通常将AppDelegate设置为默认值)。