为什么我的应用程序仅在菜单项位于AppDelegate中时才能看到菜单项的选择器?

问题描述 投票:0回答:1

我正在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中,因此如何使菜单项选择器“查看”我需要它们调用的方法?

swift cocoa nsmenu
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.