72 lines
2.0 KiB
Markdown
72 lines
2.0 KiB
Markdown
# macOS Settings
|
||
|
||
## Intent
|
||
|
||
Use this when building a macOS Settings window backed by SwiftUI's `Settings` scene.
|
||
|
||
## Core patterns
|
||
|
||
- Declare the Settings scene in the `App` and compile it only for macOS.
|
||
- Keep settings content in a dedicated root view (`SettingsView`) and drive values with `@AppStorage`.
|
||
- Use `TabView` to group settings sections when you have more than one category.
|
||
- Use `Form` inside each tab to keep controls aligned and accessible.
|
||
- Use `OpenSettingsAction` or `SettingsLink` for in-app entry points to the Settings window.
|
||
|
||
## Example: settings scene
|
||
|
||
```swift
|
||
@main
|
||
struct MyApp: App {
|
||
var body: some Scene {
|
||
WindowGroup {
|
||
ContentView()
|
||
}
|
||
#if os(macOS)
|
||
Settings {
|
||
SettingsView()
|
||
}
|
||
#endif
|
||
}
|
||
}
|
||
```
|
||
|
||
## Example: tabbed settings view
|
||
|
||
```swift
|
||
@MainActor
|
||
struct SettingsView: View {
|
||
@AppStorage("showPreviews") private var showPreviews = true
|
||
@AppStorage("fontSize") private var fontSize = 12.0
|
||
|
||
var body: some View {
|
||
TabView {
|
||
Form {
|
||
Toggle("Show Previews", isOn: $showPreviews)
|
||
Slider(value: $fontSize, in: 9...96) {
|
||
Text("Font Size (\(fontSize, specifier: "%.0f") pts)")
|
||
}
|
||
}
|
||
.tabItem { Label("General", systemImage: "gear") }
|
||
|
||
Form {
|
||
Toggle("Enable Advanced Mode", isOn: .constant(false))
|
||
}
|
||
.tabItem { Label("Advanced", systemImage: "star") }
|
||
}
|
||
.scenePadding()
|
||
.frame(maxWidth: 420, minHeight: 240)
|
||
}
|
||
}
|
||
```
|
||
|
||
## Skip navigation
|
||
|
||
- Avoid wrapping `SettingsView` in a `NavigationStack` unless you truly need deep push navigation.
|
||
- Prefer tabs or sections; Settings is already presented as a separate window and should feel flat.
|
||
- If you must show hierarchical settings, use a single `NavigationSplitView` with a sidebar list of categories.
|
||
|
||
## Pitfalls
|
||
|
||
- Don’t reuse iOS-only settings layouts (full-screen stacks, toolbar-heavy flows).
|
||
- Avoid large custom view hierarchies inside `Form`; keep rows focused and accessible.
|