gpt4 book ai didi

swift - macOS 菜单栏应用程序中禁用的菜单项

转载 作者:搜寻专家 更新时间:2023-10-31 22:29:28 25 4
gpt4 key购买 nike

我正在尝试在 macOS 上构建一个菜单栏应用。

我似乎无法弄清楚为什么某些菜单项被禁用...屏幕截图:

Screenshot of the app

如您所见,退出 菜单项已启用,并在单击时退出应用程序。但是,首选项 项被禁用。

我的代码

AppDelegate.swift:

let menuBarItem = NSStatusBar.system().statusItem(withLength: NSSquareStatusItemLength)

func applicationDidFinishLaunching(_ aNotification: Notification) {
menuBarItem.button?.image = NSImage(named: "MenuBarIcon")
menuBarItem.menu = MenuBarMenu()
}

MenuBarMenu.swift:

class MenuBarMenu: NSMenu {
init() {
super.init(title: "Menu")
self.addItem(withTitle: "Preferences...", action: #selector(MenuBarActions.openPreferencesWindow(_:)), keyEquivalent: "")
self.addItem(NSMenuItem.separator())
self.addItem(withTitle: "Quit", action: #selector(MenuBarActions.terminate(_:)), keyEquivalent: "")
}

required init(coder decoder: NSCoder) {
fatalError("init(coder:) has not been impemented")
}
}

class MenuBarActions {
@objc static func terminate(_ sender: NSMenuItem) {
NSApp.terminate(sender)
}

@objc static func openPreferencesWindow(_ sender: NSMenuItem) {
print("preferences")
}
}

我使用完全相同的方法来创建 MenuBarItems 和相同的选择器结构,所以我对这种不一致感到有点困惑。发生这种情况的原因是什么?我该如何解决这个问题?

最佳答案

您的“退出”菜单项“意外”起作用。它没有使用您实现的 terminate(_:) 方法。将 print() 语句放在那里,您会看到它没有被调用。

菜单项要么分配了特定的目标对象,要么使用响应链来搜索合适的目标。您没有为菜单项分配目标,因此它们正在使用响应者链。您的 MenuBarActions 不是响应链的一部分。 (类通常不能。某些对象可以。)因此,菜单项永远不会以您的类为目标。

Quit 菜单之所以有效,是因为应用程序对象在响应者链上,并且它有一个 terminate(_:) 方法。事实上,这就是您的 terminate(_:) 方法在被调用时将调用的内容。但菜单项实际上是直接调用它。

您应该创建一个实际的 Controller 对象(不仅仅是类)来实现操作方法并为其设置菜单项的 target 属性。

关于swift - macOS 菜单栏应用程序中禁用的菜单项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41408379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com