PreviewProvider — SwiftUI-protokollet som definierar ingångspunkten för att generera förhandsvisningar i Xcode Canvas. Implementering av protokollet gör att utvecklaren kan se gränssnittet utan att starta simulatorn, vilket snabbar upp iterationen i designfasen. Enligt Apple Developer Documentation (2026) är PreviewProvider obligatoriskt för alla SwiftUI View om projektet använder Canvas — utan det visar Canvas inte användargränssnittet. Läs mer i artikeln om SwiftUI.
Huvudpunkter
PreviewProvider — SwiftUI-protokollet som definierar kontraktet för att skapa förhandsvisningsinnehåll i Xcode Canvas. Protokollet innehåller en obligatorisk egenskap: previews av typen some View. Varje värde som returneras av previews visas i Canvas som en interaktiv förhandsvisning. PreviewProvider kräver inte arv — en statisk implementering i en extension räcker.
Arkitektoniskt sett är PreviewProvider inte en del av SwiftUI-runtime — det är uteslutande ett utvecklingsverktyg. Protokollet är markerat med attributet @available(iOS 13.0, *) och kompileras inte i release-bygget, eftersom Xcode använder villkorlig kompilering för att exkludera förhandsvizningskod från produktion. Detta innebär att PreviewProvider inte påverkar binärstorleken och applikationens prestanda.
Egenskapen previews — det enda kravet i PreviewProvider. Måste returnera vilken View som helst: från en enkel Text till en komplex hierarki med Group och ForEach. Xcode renderar den returnerade View i Canvas och tillämpar systeminställningar (tema, storlek, teckensnitt).
import SwiftUI
struct GreetingView: View {
let name: String
var body: some View {
Text("Hej, \(name)!")
.padding()
}
}
// PreviewProvider — statisk implementering
struct GreetingView_Previews: PreviewProvider {
static var previews: some View {
GreetingView(name: "World")
}
}
Namnkonvention: Apple rekommenderar att förhandsvisningsstrukturen heter {ViewName}_Previews. Detta är inte ett obligatoriskt kompilatorkrav, men förbättrar läsbarheten och navigeringen i projektet. Xcode ersätter automatiskt denna mall när en ny SwiftUI-fil skapas.
Verkningsmekanism PreviewProvider är baserad på statisk dispatch: Xcode kompilerar extensionen med PreviewProvider endast för Debug-konfigurationen och anropar previews under byggprocessen av Canvas. Varje gång koden ändras kompilerar Xcode endast de ändrade PreviewProvider, vilket säkerställer nästan omedelbar uppdatering av förhandsvisningen.
SwiftUI garanterar inte exakt överensstämmelse mellan förhandsvisningen och det slutliga UI på simulatorn eller enheten — Canvas använder förenklad rendering. Animationer med fördröjningar kan visas felaktigt, och vissa UIKit-komponenter (MapKit, WebView) renderas inte i Canvas utan ytterligare konfiguration.
Group gör det möjligt att visa flera tillstånd av en View samtidigt, vilket snabbar upp iterationen vid design av olika konfigurationer. Varje förhandsvisning inom Group renderas oberoende.
struct ButtonView_Previews: PreviewProvider {
static var previews: some View {
Group {
ButtonView(title: "Primary", style: .primary)
.previewDisplayName("Primary")
ButtonView(title: "Disabled", style: .primary)
.disabled(true)
.previewDisplayName("Disabled")
ButtonView(title: "Secondary", style: .secondary)
.previewDisplayName("Secondary")
}
}
}
previewDisplayName lägger till en etikett till varje förhandsvisning i Canvas, vilket är särskilt användbart när man jämför flera tillstånd. Det maximala antalet förhandsvisningar i Group är inte begränsat, men fler än 6–8 saktar ner Canvas.
Xcode tillhandahåller flera modifierare för att konfigurera visningen av förhandsvisningen. De viktigaste: previewDevice — emulerar en specifik enhet (iPhone 16 Pro, iPad Air, Apple Watch Ultra), previewLayout — ställer in storlek (device, fixed, sizeThatFits). Kombinationen av dessa modifierare ger full kontroll över förhandsvisningsmiljön.
previewDevice tar emot en sträng med enhetsnamnet, till exempel “iPhone 16 Pro” eller “iPad Pro 13-inch (M4)”. Listan över tillgängliga enheter beror på installerade simulatorer i Xcode. Om enheten inte hittas visar Canvas förhandsvisningen på standardenheten utan fel.
| Modifierare | Beskrivning | Exempel |
|---|---|---|
| previewDevice | Enhetsemulering | .previewDevice(“iPhone 16 Pro”) |
| previewLayout | Storleksläge | .previewLayout(.sizeThatFits) |
| previewDisplayName | Förhandsvisningsetikett | .previewDisplayName(“Dark Mode”) |
| preferredColorScheme | Designtema | .preferredColorScheme(.dark) |
| dynamicTypeSize | Teckenstorlek | .dynamicTypeSize(.xxxLarge) |
Vanlig praxis — att visa en View på flera enheter samtidigt för att kontrollera anpassningsförmågan. För detta används ForEach med en array av enhetsnamn.
struct AdaptiveView_Previews: PreviewProvider {
static var previews: some View {
ForEach(["iPhone SE (3rd generation)", "iPhone 16 Pro Max", "iPad Pro 13-inch (M4)"], id: \.self) { device in
AdaptiveView()
.previewDevice(.previewDevice(device))
.previewDisplayName(device)
}
}
}
Praktiska exempel visar olika användningsscenarier för PreviewProvider: från enkel förhandsvisning till komplexa konfigurationer med livedata och UIKit-kompatibilitet.
Mockdata — standardmönstret för förhandsvisning när en View tar emot en modell. Istället för verkligt API ersätts testdata, vilket möjliggör visuell kontroll av UI-status utan att starta applikationen.
struct UserProfileView: View {
let user: User
var body: some View {
VStack {
AsyncImage(url: user.avatarURL)
.clipShape(Circle())
Text(user.name)
.font(.title)
Text(user.bio)
.font(.body)
.foregroundColor(.secondary)
}
}
}
struct UserProfileView_Previews: PreviewProvider {
static var previews: some View {
UserProfileView(user: .mock)
.previewDisplayName("Profile")
UserProfileView(user: .mockLongName)
.previewDisplayName("Long Name")
}
}
UIKit-kompatibilitet — PreviewProvider fungerar även med UIKit-komponenter inslagna i UIViewRepresentable. Detta gör det möjligt att förhandsvisa befintliga UIKit-vyer i SwiftUI Canvas utan att migrera hela projektet.
struct MapViewRepresentable: UIViewRepresentable {
func makeUIView(context: Context) -> MKMapView {
MKMapView()
}
func updateUIView(_ uiView: MKMapView, context: Context) {
// Konfigurera karta
}
}
struct MapView_Previews: PreviewProvider {
static var previews: some View {
MapViewRepresentable()
}
}
Canvas — är Xcodes visuella redigerare som renderar resultatet av PreviewProvider i realtid. Utan implementering av PreviewProvider förblir Canvas tom. Canvas och PreviewProvider arbetar tillsammans: PreviewProvider bestämmer vad som ska visas, Canvas — var och hur.
Det är viktigt att förstå: Canvas — är körmiljön för förhandsvisningen, inte ett alternativ till PreviewProvider. Även om utvecklaren inte öppnar Canvas kan PreviewProvider användas för snabb kodkontroll via förhandsvisningen som visas när man hovrar över Canvas-ikonen. Enligt WWDC 2024 rekommenderar Apple att skriva PreviewProvider för varje View som utvecklingsstandard, liknande att skriva enhetstester.
| Komponent | Roll | Obligatoriskhet |
|---|---|---|
| PreviewProvider | Bestämmer förhandsvisningsinnehåll | Obligatoriskt för Canvas |
| Canvas | Renderar förhandsvisning i redigeraren | Valfritt (.preview kan användas) |
| SwiftUI View | UI-komponent | Obligatoriskt |
Rekommendation: skriv PreviewProvider för varje offentlig View i projektet. Det snabbar upp introduktionen av nya utvecklare, förenklar kodgranskning och möjliggör snabb kontroll av visuella ändringar utan att bygga hela projektet.
Problem 1: Förhandsvisningen uppdateras inte. Om Canvas inte speglar kodändringar är orsaken oftast DerivedData-cachen. Rensa DerivedData via Product → Clean Build Folder (⇧⌘K) eller genom att manuellt ta bort mappen ~/Library/Developer/Xcode/DerivedData. Efter rensningen bygger Canvas om förhandsvisningen från början.
Problem 2: PreviewProvider ser inte @StateObject. PreviewProvider skapar en statisk instans av View, därför måste beroenden som kräver injicering (ViewModel, tjänster) skickas via initieraren eller @StateObject med standardvärde. Använd mock-objekt istället för riktiga tjänster i förhandsvisningen.
Problem 3: Animationer fungerar inte i Canvas. Canvas stödjer inte alla SwiftUI-animationer — särskilt de som är tidsberoende (withAnimation med fördröjning, .spring). För att kontrollera animationer, kör applikationen på simulatorn. Canvas är lämpligt för statisk layoutkontroll.
Beroendeinjektion — det bästa sättet att få PreviewProvider att fungera med komplexa ViewModel. Skapa en separat ViewModel-instans med testdata och skicka den till Viewns initierare.
struct DashboardView: View {
@StateObject var viewModel: DashboardViewModel
var body: some View {
List(viewModel.items) { item in
Text(item.title)
}
}
}
struct DashboardView_Previews: PreviewProvider {
static var previews: some View {
DashboardView(viewModel: DashboardViewModel.mock)
}
}
Mock-förlängningar: skapa en extension för ViewModel som tillhandahåller statiska .mock-instanser. Detta håller testdata nära ViewModel och gör PreviewProvider läsbar.
Vanliga frågor
Tekniskt sett nej — applikationen kompileras även utan PreviewProvider. Men i praktiken rekommenderar Apple och SwiftUI-gemenskapen att skriva förhandsvisningar för varje offentlig View. PreviewProvider snabbar upp utvecklingen, möjliggör snabb layoutkontroll på olika enheter och fungerar som visuell dokumentation för teamet.
PreviewProvider lägger till kod endast i Debug-bygget, så kompileringsfel kan uppstå om förhandsvisningen använder typer som inte är tillgängliga i release-konfigurationen. Fel uppstår också vid användning av @available med plattformar som inte stödjer Canvas, eller när komplexitetsgränsen för förhandsvisningen överskrids.
Direkt — inte alls, PreviewProvider körs isolerat. Använd mockdata: skapa en statisk extension av modellen med .mock-instanser. För View med @StateObject, skicka ViewModel med testdata via initieraren. Detta simulerar riktiga data utan nätverksförfrågningar.
Nej, PreviewProvider påverkar inte storleken på release-binären. Xcode använder villkorlig kompilering (#if DEBUG / #if !RELEASE) för att exkludera förhandsvisningskod från release-bygget. PreviewProvider-kod finns endast i Debug-konfigurationen och kommer inte in i App Store-bygget.
Ja, Xcode stödjer felsökning av förhandsvisningar. Placera en brytpunkt inuti previews eller själva View-koden och välj Product → Preview → Debug Preview. Därefter aktiveras brytpunkten när Canvas renderas. Detta är användbart för att analysera layoutproblem som endast syns i förhandsvisningen.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också