1

我尝试在我的 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 时,.removeItemand.isHidden = true仍然可以工作,但其余的则不能。

为什么在你的 UI 中的某个地方有一个 NavigationView(它不必是最上面的,也可以是更多层)使我能够向菜单项添加一个快捷键?这是一个错误吗?如果是,这是一个已知的错误吗?如果不是,为什么会这样?

我应该完全自己构建主菜单,而不是使用应用程序创建的默认菜单吗?

4

0 回答 0