SwiftUI:更改 macOS 上的默认命令菜单

Posted

技术标签:

【中文标题】SwiftUI:更改 macOS 上的默认命令菜单【英文标题】:SwiftUI: Changing default Command Menus on macOS 【发布时间】:2021-01-03 17:05:58 【问题描述】:

我正在尝试更改 macOS SwiftUI 应用程序中的默认命令。我想在“查看”菜单中添加一些自定义命令,但无法正常工作。

这是我尝试过的:

@main
struct MyApp: App 

    var body: some Scene 
        
        WindowGroup 
            AppView()
                .environmentObject(AppModel.shared)
                .environment(\.managedObjectContext, AppModel.shared.cloudKitCoordinator.coreDataStack.viewContext)
        
        .commands 
            ViewCommands()
            SidebarCommands()
            ElementCommands()
            NavigationCommands()
        
        
    
    


struct ViewCommands: Commands 

    var body: some Commands 
        
        CommandMenu("View") 
            Button("Do something View related") 
        
        
    
    

但不是将命令附加到“查看”菜单,而是创建了第二个同名菜单:

有没有人幸运地更改了默认命令菜单,或者这只是 SwiftUI 的一部分,仍然有点原始?

【问题讨论】:

【参考方案1】:

使用 CommandGroup,它具有附加或替换现有菜单的初始化选项:

.commands 
    CommandGroup(before: CommandGroupPlacement.newItem) 
        Button("before item") 
            print("before item")
        
    

    CommandGroup(replacing: CommandGroupPlacement.appInfo) 
        Button("Custom app info") 
            // show custom app info
        
    

    CommandGroup(after: CommandGroupPlacement.newItem) 
        Button("after item") 
            print("after item")
        
    

不错的教程:https://swiftwithmajid.com/2020/11/24/commands-in-swiftui/

【讨论】:

【参考方案2】:

接受的答案在建议 CommandGroup 而不是 CommandMenu 方面通常是正确的,并且有助于将我们指向 Swift with Majid(一个很棒的网站),但令人恼火的是,它并没有给我们确切的 答案 - 查看菜单是哪个CommandGroupPlacement

为了节省所有其他人的反复试验

CommandGroup(before: CommandGroupPlacement.toolbar) 
    Toggle("Show X", isOn: $model.settings.showX)
    Toggle("Show Y", isOn: $model.settings.showY)
    Divider()

【讨论】:

【参考方案3】:

我发现 swiftUI 删除默认菜单项的唯一方法是执行以下类:

class TheApp
    static func removeUnnecessaryMenus() 
        if let menu = NSApplication.shared.mainMenu 
            menu.items.removeFirst $0.title == "Edit" 
            menu.items.removeFirst $0.title == "File" 
            menu.items.removeFirst $0.title == "Window" 
            menu.items.removeFirst $0.title == "View" 
        
    

并在某些 View init() 函数上调用 TheApp.removeUnnecessaryMenus()

这是 BAD SOLUTION ,但我找不到 SwiftUI 2 的替代方案

【讨论】:

以上是关于SwiftUI:更改 macOS 上的默认命令菜单的主要内容,如果未能解决你的问题,请参考以下文章

macOS 上的 SwiftUI:如何为 onDelete 启用 UI(从列表中删除)

通过左键单击 macOS 触发 SwiftUI 上下文菜单

使用 SwiftUI 更改 macOS 窗口级别(制作浮动窗口)

macOS 上的 SwiftUI 选择器

macOS 上的 Swiftui 表单标签对齐

如何检测何时点击 TextField? (MacOS 上的 SwiftUI)