mirror of
https://github.com/Dimillian/Skills.git
synced 2026-03-25 08:55:54 +00:00
Added a new reference file detailing best practices for loading states and placeholders in SwiftUI, including usage of redacted placeholders and ContentUnavailableView. Updated the components index to include a link to the new loading & placeholders documentation.
1.2 KiB
1.2 KiB
Loading & Placeholders
Use this when a view needs a consistent loading state (skeletons, redaction, empty state) without blocking interaction.
Patterns to prefer
- Redacted placeholders for list/detail content to preserve layout while loading.
- ContentUnavailableView for empty or error states after loading completes.
- ProgressView only for short, global operations (use sparingly in content-heavy screens).
Recommended approach
- Keep the real layout, render placeholder data, then apply
.redacted(reason: .placeholder). - For lists, show a fixed number of placeholder rows (avoid infinite spinners).
- Switch to
ContentUnavailableViewwhen load finishes but data is empty.
Pitfalls
- Don’t animate layout shifts during redaction; keep frames stable.
- Avoid nesting multiple spinners; use one loading indicator per section.
- Keep placeholder count small (3–6) to reduce jank on low-end devices.
Minimal usage
VStack {
if isLoading {
ForEach(0..<3, id: \.self) { _ in
RowView(model: .placeholder())
}
.redacted(reason: .placeholder)
} else if items.isEmpty {
ContentUnavailableView("No items", systemImage: "tray")
} else {
ForEach(items) { item in RowView(model: item) }
}
}