SwiftUI 创建MacOS App 的菜单

当开发一个 Mac App 的时候,菜单栏是必不可少的部分,以 Safari 为例,可以看出有很多使用的功能都会放到菜单部分。
image.png

这篇文章会介绍如何用 SwiftUI 创建菜单。

新建项目

用 Xcode 新建一个 Mac ,如下图所示
image.png

image.png

新建完项目之后,运行程序可以看到一些默认的菜单,如下图所示:
image.png

定义新菜单

打开 menuDemoApp.swift 文件,修改代码如下

import SwiftUI

@main
struct menuDemoApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        // 这里是新增的代码
        .commands {
            CommandMenu("新菜单"){
                Button("子菜单 1"){
                    print("点击 子菜单 1")
                }
            }
        }
    }
}

image.png

再加一个子菜单,代码如下:

        // 这里是新增的代码
        .commands {
            CommandMenu("新菜单"){
                Button("子菜单 1"){
                    print("点击 子菜单 1")
                }
                Button("子菜单 2"){
                    print("点击 子菜单 2")
                }
            }
        }

给菜单加快捷键

加快捷键,使用 .keyboardShortcut("i"), 代码如下:

 .commands {
            CommandMenu("新菜单"){
                Button("子菜单 1"){
                    print("点击 子菜单 1")
                }
                .keyboardShortcut("i")
                Button("子菜单 2"){
                    print("点击 子菜单 2")
                }
                .keyboardShortcut("u")
            }
        }

image.png

菜单复用

如果有多个窗口,那么就需要菜单复用了,这时候可以定义一个 struct,完整代码如下:

import SwiftUI

@main
struct menuDemoApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        // 这里是新增的代码
        .commands {
            MyCommandMenu()
        }
    }
}

struct MyCommandMenu: Commands {
    var body: some Commands {
        CommandMenu("新菜单"){
            Button("子菜单 1"){
                print("点击 子菜单 1")
            }
            .keyboardShortcut("i")
            Button("子菜单 2"){
                print("点击 子菜单 2")
            }
            .keyboardShortcut("u")
        }
    }
}

增加设置菜单

一般程序都会有 设置 菜单,目前我们的程序还没有
image.png

如何添加呢?
很简单,在D2cSimApp 的WindowGroup 同级加下面代码

    Settings {
           SettingHome() // 这里自定义视图
        }

再次运行可以看到有了设置。
image.png

现有菜单的新增和替换

        // 在设置之前新增一个检查更新的按钮
		CommandGroup(before: .appSettings) {
                Button("Check for updates"){
                    
                }
            }
        // 替换关于按钮
            CommandGroup(replacing: .appInfo) {
                Button("Hello , World"){
                    
                }
            }

image.png

可以通过类似的方式,去替换一些其他菜单项。


已发布

分类

作者:

标签

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注