SwiftUI Settings窗口
SwiftUI Settings窗口

SwiftUI Settings窗口

在 SwiftUI for macOS 中,Settings {} 是一个特殊的 Scene,用于定义应用的“设置”窗口(Preferences window)。

Settings {} 是 SwiftUI 的 App 协议中用于声明设置窗口的语法,它是一个空的设置窗口,实际上并不会显示任何内容。

基本用法

1、标准用途(带内容):

Settings {
    Text("设置内容")
}

这样,当用户点击菜单栏中的“应用名 > 设置…”时,会弹出一个窗口,显示里面的内容(例如设置项、选项按钮等)。

2、空Settings:

Settings {}

这相当于告诉系统:“我定义了一个设置窗口,但里面什么都没有。”这将防止 SwiftUI 自动创建默认的设置窗口行为。

使用场景

在macOS中,如果完全使用AppDelegate自定义主窗口和行为,不定义任何Scene:

struct ImageSlimApp: App {
    @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    var body: some Scene {
    }
}

macOS会认为没有声明任何可视窗口或界面,也没有告诉系统要添加什么菜单栏,因此,它只加一个默认的“显示标签页栏”等系统菜单。

这也是 SwiftUI 的一种安全回退行为,导致菜单栏非常“简陋”,缺少常规的“文件(File)、编辑(Edit)、帮助(Help)”等。

添加Settings {} 后,菜单栏恢复正常:

@main
struct ImageSlimApp: App {
    @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

    var body: some Scene {
        // 空 Scene,窗口由 AppDelegate 管理
        Settings { }  // 占位,不弹出任何窗口
    }
}

SwiftUI看到一个Scene声明,它会自动:

1)生成完整的 macOS 菜单栏(包括 App 名、文件、编辑、窗口、帮助等);

2)增加一个默认的“应用名称 > 设置…”菜单项,并关联提供的 Settings Scene。

因为这里传入的是空的Settings {},所以点击“设置…”菜单时会打开一个空白窗口。

因此,可以给Settings传入一个应用的设置视图:

@main
struct ImageSlimApp: App {
    @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

    var body: some Scene {
        // 空 Scene,窗口由 AppDelegate 管理
        Settings {
            SettingsView()    // 设置视图
        }
    }
}

或者,使用NSMenu自定义菜单栏。

总结

Settings通常用于显示macOS设置窗口,如果没有任何窗口,可以使用Settings {} 占位避免出错。

相关文章

1、macOS顶部和上下文菜单NSMenu:https://fangjunyu.com/2025/06/23/macos%e9%a1%b6%e9%83%a8%e5%92%8c%e4%b8%8a%e4%b8%8b%e6%96%87%e8%8f%9c%e5%8d%95nsmenu/

2、macOS单个菜单项类NSMenuItem:https://fangjunyu.com/2025/06/25/macos%e5%8d%95%e4%b8%aa%e8%8f%9c%e5%8d%95%e9%a1%b9%e7%b1%bbnsmenuitem/

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

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