【问题标题】:How do I set or disable main menu keyboard shortcut programmatically in SwiftUI for a macOS app?如何在 SwiftUI 中以编程方式为 macOS 应用程序设置或禁用主菜单键盘快捷键?
【发布时间】:2022-12-10 11:51:40
【问题描述】:

比如说,我想将以下主菜单项添加到我的 macOS 应用程序 - Next

@main
struct MyApp: App {

    @ObservedObject var appState = DataViewModel.shared
    
    var body: some Scene {
        
        WindowGroup
        {
                ContentView()
        }
        .commands {
            CommandGroup(replacing: .pasteboard) {
                Button(action: {
                    appState.nextCurrentID()
                }) { Text("Next")}
                    .keyboardShortcut("V", modifiers: [.command, .option, .shift])
            }
        }
   }
}

但我想根据两个变量执行以下操作:

  • 根据appState.EnableShortcutKey启用/禁用该菜单项的键盘快捷键

  • 根据appState.ShortcutKey设置快捷键

  • 根据appState.Modifiers设置修饰符

这些状态变量声明如下:

@Published public var EnableShortcutKey : Bool = false
@Published public var ShortcutKey : String = "A"
@Published public var Modifiers : NSEvent.ModifierFlags = [.command, .shift]

我怎么做?

【问题讨论】:

    标签: macos swiftui


    【解决方案1】:

    像这样:

    @main
    struct SO_mac_TestsApp: App {
        
        @StateObject var menuOptions = MenuOptions()
        
        var body: some Scene {
            WindowGroup {
                ContentView()
                    .environmentObject(menuOptions)
            }
            .commands {
                CommandGroup(replacing: .pasteboard) {
                    Button(action: {
                        print("appState.nextCurrentID()")
                    }) { Text("Next")}
                        .keyboardShortcut(menuOptions.shortcutKey, modifiers: menuOptions.modifiers)
                        .disabled(menuOptions.enableShortcutKey == false)
                }
            }
        }
    }
    
    
    class MenuOptions: ObservableObject {
        @Published public var enableShortcutKey : Bool = false
        @Published public var shortcutKey : KeyEquivalent = "A"
        @Published public var modifiers : EventModifiers = [.command, .shift]
    }
    
    
    truct ContentView: View {
        
        @EnvironmentObject var menuOptions: MenuOptions
        @State private var shortcut = ""
        
        var body: some View {
            Form {
                Toggle("Enable Shortcut", isOn: $menuOptions.enableShortcutKey)
                TextField("Shortcut", text: $shortcut)
                    .onSubmit {
                        menuOptions.shortcutKey = KeyEquivalent(shortcut.first ?? "V")
                    }
                Divider()
                Text("Modifiers:")
                Toggle("command:", isOn: Binding(
                            get: { menuOptions.modifiers.contains(.command) },
                            set: { new,_ in
                                if new { menuOptions.modifiers.insert(.command)
                                } else { menuOptions.modifiers.subtract(.command) }
                            }
                        ) )
                Toggle("option:", isOn: Binding(
                            get: { menuOptions.modifiers.contains(.option) },
                            set: { new,_ in
                                if new { menuOptions.modifiers.insert(.option)
                                } else { menuOptions.modifiers.subtract(.option) }
                            }
                        ) )
                Toggle("shift:", isOn: Binding(
                            get: { menuOptions.modifiers.contains(.shift) },
                            set: { new,_ in
                                if new { menuOptions.modifiers.insert(.shift)
                                } else { menuOptions.modifiers.subtract(.shift) }
                            }
                        ) )
                Toggle("control:", isOn: Binding(
                            get: { menuOptions.modifiers.contains(.control) },
                            set: { new,_ in
                                if new { menuOptions.modifiers.insert(.control)
                                } else { menuOptions.modifiers.subtract(.control) }
                            }
                        ) )
    
            }
            .padding()
            .onAppear {
                shortcut = String(menuOptions.shortcutKey.character)
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-17
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      • 2015-03-28
      • 1970-01-01
      相关资源
      最近更新 更多