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 を削除し、Show Text("hi") のみを削除すると、AppDelegate からのすべてのコマンドが正常に機能します。ただし、UI のどこかに NavigationView がある場合、.removeItemとは機能します.isHidden = trueが、残りは機能しません。

UI のどこかに NavigationView があると (最上位である必要はなく、その間に複数のレイヤーを配置することもできます)、メニュー項目にキー ショートカットを追加できるのはなぜですか? これはバグですか?はいの場合、これは既知のバグですか? いいえの場合、なぜそれが起こっているのですか?

アプリによって作成されたデフォルトのメニューを使用するのではなく、メイン メニューを完全に自分で作成する必要がありますか?

4

0 に答える 0