home / skills / rshankras / claude-code-apple-skills / settings-screen
This skill generates a production-ready SwiftUI settings screen with modular sections and platform-appropriate integration for iOS and macOS.
npx playbooks add skill rshankras/claude-code-apple-skills --skill settings-screenReview the files below or copy the command above to add this skill to your agents.
---
name: settings-screen
description: Generates a complete settings screen for iOS/macOS apps with common sections. Use when user wants to add settings, preferences, or configuration UI.
allowed-tools: [Read, Write, Edit, Glob, Grep, Bash, AskUserQuestion]
---
# Settings Screen Generator
Generates a production-ready settings screen with modular sections for iOS and macOS apps.
## When This Skill Activates
- User asks to "add settings" or "create settings screen"
- User mentions "preferences", "app settings", or "configuration UI"
- User wants to add dark mode toggle, notifications settings, or about screen
## Pre-Generation Checks (CRITICAL)
### 1. Project Context Detection
Before generating, ALWAYS check:
```
# Find existing settings implementations
rg -l "SettingsView|PreferencesView|SettingsScreen" --type swift
# Check deployment target
cat Package.swift | grep -i "platform"
# Or check project.pbxproj for deployment target
# Detect architecture pattern
rg -l "Observable|ObservableObject|@EnvironmentObject" --type swift | head -5
# Check platform (iOS vs macOS)
rg "UIKit|UIApplication" --type swift | head -1 # iOS
rg "AppKit|NSApplication" --type swift | head -1 # macOS
```
### 2. Conflict Detection
If existing settings implementation found:
- Ask user: Extend existing, replace, or create separate?
- Check for naming conflicts with existing files
## Configuration Questions
Ask user via AskUserQuestion:
1. **Which sections do you need?**
- Account (sign out, delete account)
- Appearance (dark mode, app icon)
- Notifications (push settings)
- About (version, developer info)
- Legal (terms, privacy)
2. **Platform?**
- iOS (NavigationStack)
- macOS (Settings scene / NavigationSplitView)
- Both (adaptive)
3. **Additional features?**
- App icon selector
- Language selector
- Data export
- Cache clearing
## Generation Process
### Step 1: Create Core Files
Generate these files (customize based on answers):
```
Sources/Settings/
├── SettingsView.swift # Main container
├── AppSettings.swift # @AppStorage wrapper
├── Components/
│ └── SettingsRow.swift # Reusable row component
└── Sections/
├── AppearanceSettingsView.swift
├── AccountSettingsView.swift
├── NotificationsSettingsView.swift
├── AboutSettingsView.swift
└── LegalSettingsView.swift
```
### Step 2: Read Templates
Read templates from this skill:
- `templates/SettingsView.swift`
- `templates/AppSettings.swift`
- `templates/SettingsRow.swift`
- `templates/AppearanceSettingsView.swift`
- `templates/AccountSettingsView.swift`
- `templates/NotificationsSettingsView.swift`
- `templates/AboutSettingsView.swift`
- `templates/LegalSettingsView.swift`
### Step 3: Customize for Project
Adapt templates to match:
- Project naming conventions
- Existing architecture patterns
- Selected sections only
- Platform-specific code
### Step 4: Integration
**iOS Integration:**
```swift
// In any view
NavigationLink("Settings") {
SettingsView()
}
// Or as sheet
.sheet(isPresented: $showSettings) {
NavigationStack {
SettingsView()
}
}
```
**macOS Integration:**
```swift
// In App.swift
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
Settings {
SettingsView()
}
}
}
```
## Platform-Specific Considerations
### iOS
- Use `NavigationStack` with `List`
- Use `Form` for grouped appearance
- Link to Settings app for notifications: `UIApplication.openSettingsURLString`
### macOS
- Use `Settings` scene for standard preferences window
- Consider `TabView` for multiple sections
- Use `Form` with appropriate styling
- Support keyboard shortcut (⌘,)
### Cross-Platform
- Use conditional compilation for platform-specific features
- Abstract platform differences in AppSettings
## Generated Code Patterns
### AppStorage Wrapper
```swift
@Observable
final class AppSettings {
static let shared = AppSettings()
@AppStorage("appearance") var appearance: Appearance = .system
@AppStorage("notificationsEnabled") var notificationsEnabled = true
enum Appearance: String, CaseIterable {
case system, light, dark
}
}
```
### Settings Row Component
```swift
struct SettingsRow<Content: View>: View {
let icon: String
let iconColor: Color
let title: String
let content: () -> Content
var body: some View {
HStack {
Image(systemName: icon)
.foregroundStyle(iconColor)
.frame(width: 28)
Text(title)
Spacer()
content()
}
}
}
```
## Verification Checklist
After generation, verify:
- [ ] Settings accessible from main UI
- [ ] All selected sections present
- [ ] AppStorage persists between launches
- [ ] Dark mode toggle works correctly
- [ ] Links to external URLs work (privacy, terms)
- [ ] Platform-appropriate navigation
- [ ] Accessibility labels present
- [ ] VoiceOver navigation works
## Common Customizations
### Adding Custom Sections
```swift
// In SettingsView
Section("Custom") {
NavigationLink("My Feature") {
MyFeatureSettingsView()
}
}
```
### Conditional Features
```swift
#if DEBUG
Section("Debug") {
DebugSettingsView()
}
#endif
```
### Subscription Integration
```swift
if !subscriptionStatus.hasAccess {
Section {
Button("Upgrade to Pro") {
showPaywall = true
}
}
}
```
## Related Skills
- `paywall-generator` - For subscription upgrade prompts in settings
- `auth-flow` - For account management integration
- `review-prompt` - Trigger review from settings (sparingly)
## References
- [Apple HIG: Settings](https://developer.apple.com/design/human-interface-guidelines/settings)
- [SwiftUI Settings Scene](https://developer.apple.com/documentation/swiftui/settings)
- [AppStorage Documentation](https://developer.apple.com/documentation/swiftui/appstorage)
This skill generates a production-ready settings (preferences) screen for iOS and macOS apps with modular, reusable sections. It scaffolds platform-appropriate SwiftUI files, AppStorage wrappers, and small UI components so you can plug the settings into your app quickly. Use it to add account, appearance, notifications, legal, and about sections with optional extras like app icon and language selectors.
The generator inspects your project for existing settings implementations and platform targets, then asks which sections and features you need. It creates a SettingsView container, an AppSettings @AppStorage wrapper, reusable SettingsRow components, and per-section views (Appearance, Account, Notifications, About, Legal). Templates are adapted to your architecture and platform using conditional compilation where needed.
Will this overwrite existing settings code?
The generator first detects existing implementations and will prompt whether to extend, replace, or create a separate settings module to avoid accidental overwrites.
How are settings persisted?
Settings use an AppSettings wrapper backed by @AppStorage so values persist across launches and can be shared via UserDefaults.