我尝试在我的 SwiftUI macOS 应用程序中更改主菜单的某些项目。我还没有使用 UIKit 和 UIMenuBuilder 的 macOS Catalyst。我也想为 Catalyst 以下的 macOS 版本创建我的应用程序。
我添加了一个 AppDelegate,我想通过删除某些条目来更改主菜单,并向编辑 > 删除命令添加一个快捷键。
在我将 NavigationView 添加到视图堆栈之前,一切正常:
import Cocoa
import SwiftUI
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ aNotification: Notification) {
let mainMenu = NSApplication.shared.mainMenu
// this works
mainMenu!.removeItem(mainMenu!.item(withTitle: "File")!)
mainMenu!.item(withTitle: "Help")!.isHidden = true
// the following lines have no effect
let key = String(utf16CodeUnits: [unichar(NSBackspaceCharacter)], count: 1) as String
let del = mainMenu!.item(withTitle: "Edit")!.submenu!.item(withTitle: "Delete")
del!.keyEquivalent = key
del!.keyEquivalentModifierMask = NSEvent.ModifierFlags.command
del!.action = #selector(foobar)
// no item is added to Edit menu
let newItem = NSMenuItem(title: "Foobar", action: #selector(foobar), keyEquivalent: "D")
mainMenu!.item(withTitle: "Edit")!.submenu!.addItem(newItem)
}
@objc func foobar() {
print("foobar")
}
}
@main
struct testApp: App {
#if os(macOS)
@NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
#endif
var body: some Scene {
WindowGroup {
NavigationView {
Text("hi")
}
.frame(width: 300, height: 200, alignment: .center)
}
}
}
当您在 testApp 中删除 NavigationView 并且仅显示文本(“hi”)时,我的 AppDelegate 中的所有命令都可以正常工作。但是,当您在 UI 中的某处有 NavigationView 时,.removeItem
and.isHidden = true
仍然可以工作,但其余的则不能。
为什么在你的 UI 中的某个地方有一个 NavigationView(它不必是最上面的,也可以是更多层)使我能够向菜单项添加一个快捷键?这是一个错误吗?如果是,这是一个已知的错误吗?如果不是,为什么会这样?
我应该完全自己构建主菜单,而不是使用应用程序创建的默认菜单吗?