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 があると (最上位である必要はなく、その間に複数のレイヤーを配置することもできます)、メニュー項目にキー ショートカットを追加できるのはなぜですか? これはバグですか?はいの場合、これは既知のバグですか? いいえの場合、なぜそれが起こっているのですか?
アプリによって作成されたデフォルトのメニューを使用するのではなく、メイン メニューを完全に自分で作成する必要がありますか?