PreviewProvider – wat is het, SwiftUI-protocol en configuratie in Xcode

Auteur: IT Sectr Gepubliceerd: 2026-06-27 Leestijd: 10 min

PreviewProvider – het SwiftUI-protocol dat het toegangspunt definieert voor het genereren van voorbeelden in Xcode Canvas. Implementatie van het protocol stelt de ontwikkelaar in staat de interface te zien zonder de simulator te starten, wat de iteratie in de ontwerpfase versnelt. Volgens Apple Developer Documentation (2026) is PreviewProvider verplicht voor alle SwiftUI Views als het project Canvas gebruikt – zonder hem geeft Canvas de gebruikersinterface niet weer. Lees meer in het artikel over SwiftUI.

Belangrijkste punten

  • PreviewProvider – SwiftUI-protocol voor het genereren van Xcode-voorbeelden in Canvas.
  • Eén vereiste – het protocol bevat één berekende eigenschap previews: some View.
  • Meerdere voorbeelden – via Group kunnen meerdere toestanden van één View worden weergegeven.
  • Apparaatconfiguraties – previewDevice, previewLayout en displayName configureren de weergave.
  • UIKit-compatibiliteit – UIViewRepresentable en UIViewControllerRepresentable ondersteunen ook PreviewProvider.

Wat is PreviewProvider?

PreviewProvider – het SwiftUI-protocol dat het contract definieert voor het maken van voorbeeldinhoud in Xcode Canvas. Het protocol bevat één verplichte eigenschap: previews van het type some View. Elke waarde die door previews wordt geretourneerd, wordt in Canvas weergegeven als een interactief voorbeeld. PreviewProvider vereist geen overerving – een statische implementatie in een extension is voldoende.

Architectonisch maakt PreviewProvider geen deel uit van de SwiftUI-runtime – het is uitsluitend een ontwikkeltool. Het protocol is gemarkeerd met het @available(iOS 13.0, *)-attribuut en wordt niet gecompileerd in de release-build, omdat Xcode conditionele compilatie gebruikt om voorbeeldcode uit productie uit te sluiten. Dit betekent dat PreviewProvider geen invloed heeft op de binaire grootte en prestaties van de applicatie.

Protocol previews

Eigenschap previews – de enige vereiste van PreviewProvider. Het moet elke View retourneren: van een eenvoudige Text tot een complexe hiërarchie met Group en ForEach. Xcode rendert de geretourneerde View in Canvas, waarbij systeeminstellingen (thema, grootte, lettertype) worden toegepast.

swift
import SwiftUI

struct GreetingView: View {
    let name: String
    
    var body: some View {
        Text("Hallo, \(name)!")
            .padding()
    }
}

// PreviewProvider – statische implementatie
struct GreetingView_Previews: PreviewProvider {
    static var previews: some View {
        GreetingView(name: "World")
    }
}

Naamgevingsconventie: Apple raadt aan om de voorbeeldstructuur {ViewName}_Previews te noemen. Dit is geen verplichte vereiste van de compiler, maar verbetert de leesbaarheid en navigatie door het project. Xcode vult dit sjabloon automatisch in bij het maken van een nieuw SwiftUI-bestand.

Hoe werkt PreviewProvider: protocol en methode previews

Werkingsmechanisme van PreviewProvider is gebaseerd op statische dispatch: Xcode compileert de extension met PreviewProvider alleen voor de Debug-configuratie en roept previews aan tijdens het bouwen van Canvas. Elke keer dat de code verandert, hercompileert Xcode alleen de gewijzigde PreviewProviders, wat een bijna directe voorbeeldupdate garandeert.

SwiftUI garandeert geen exacte overeenkomst van het voorbeeld met de uiteindelijke UI op de simulator of het apparaat – Canvas gebruikt vereenvoudigde rendering. Animaties met vertragingen kunnen onjuist worden weergegeven en sommige UIKit-componenten (MapKit, WebView) worden niet in Canvas gerenderd zonder extra configuratie.

Meerdere voorbeelden via Group

Group maakt het mogelijk meerdere toestanden van één View tegelijkertijd weer te geven, wat de iteratie bij het ontwerpen van verschillende configuraties versnelt. Elk voorbeeld binnen de Group wordt onafhankelijk gerenderd.

swift
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 voegt een label toe aan elk voorbeeld in Canvas, wat vooral handig is bij het vergelijken van meerdere toestanden. Het maximale aantal voorbeelden in Group is niet beperkt, maar meer dan 6–8 vertraagt Canvas.

Configuratie van het voorbeeld in Xcode

Xcode biedt verschillende modifiers voor het configureren van de voorbeeldweergave. De belangrijkste: previewDevice – emuleert een specifiek apparaat (iPhone 16 Pro, iPad Air, Apple Watch Ultra), previewLayout – stelt de grootte in (device, fixed, sizeThatFits). Combinatie van deze modifiers geeft volledige controle over de voorbeeldomgeving.

previewDevice ontvangt een string met de apparaatnaam, bijvoorbeeld „iPhone 16 Pro" of „iPad Pro 13-inch (M4)". De lijst met beschikbare apparaten hangt af van de geïnstalleerde simulatoren in Xcode. Als het apparaat niet wordt gevonden, geeft Canvas het voorbeeld weer op het standaardapparaat zonder foutmelding.

ModifierBeschrijvingVoorbeeld
previewDeviceApparaatemulatie.previewDevice(„iPhone 16 Pro")
previewLayoutGrootte-modus.previewLayout(.sizeThatFits)
previewDisplayNameVoorbeeldlabel.previewDisplayName(„Dark Mode")
preferredColorSchemeOntwerpthema.preferredColorScheme(.dark)
dynamicTypeSizeLettergrootte.dynamicTypeSize(.xxxLarge)

Voorbeelden voor verschillende apparaten

Veelgebruikte praktijk – één View op meerdere apparaten tegelijk weergeven om de responsiviteit te controleren. Hiervoor wordt ForEach met een array van apparaatnamen gebruikt.

swift
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)
        }
    }
}

Voorbeelden van PreviewProvider

Praktische voorbeelden tonen verschillende gebruiksscenario's van PreviewProvider: van eenvoudig voorbeeld tot complexe configuraties met live gegevens en UIKit-compatibiliteit.

Voorbeeld met mockgegevens

Mockgegevens – het standaardpatroon voor voorbeeld wanneer een View een model accepteert. In plaats van de echte API worden testgegevens ingevoegd, wat visuele controle van de UI-status mogelijk maakt zonder de applicatie te starten.

swift
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-voorbeeld via UIViewRepresentable

UIKit-compatibiliteit – PreviewProvider werkt ook met UIKit-componenten die zijn verpakt in UIViewRepresentable. Dit maakt het mogelijk bestaande UIKit-weergaven in SwiftUI Canvas te bekijken zonder migratie van het hele project.

swift
struct MapViewRepresentable: UIViewRepresentable {
    func makeUIView(context: Context) -> MKMapView {
        MKMapView()
    }
    
    func updateUIView(_ uiView: MKMapView, context: Context) {
        // Configureer kaart
    }
}

struct MapView_Previews: PreviewProvider {
    static var previews: some View {
        MapViewRepresentable()
    }
}

PreviewProvider en SwiftUI Canvas

Canvas – is de visuele editor van Xcode die het resultaat van PreviewProvider in realtime rendert. Zonder implementatie van PreviewProvider blijft Canvas leeg. Canvas en PreviewProvider werken samen: PreviewProvider bepaalt wat wordt getoond, Canvas – waar en hoe.

Het is belangrijk te begrijpen: Canvas – is de uitvoeringsomgeving van het voorbeeld, geen alternatief voor PreviewProvider. Zelfs als de ontwikkelaar Canvas niet opent, kan PreviewProvider worden gebruikt voor snelle codecontrole via het voorbeeld dat verschijnt bij hoveren op het Canvas-pictogram. Volgens WWDC 2024 beveelt Apple het schrijven van PreviewProvider voor elke View aan als ontwikkelingsstandaard, vergelijkbaar met het schrijven van unittesten.

ComponentRolVerplichting
PreviewProviderBepaalt de voorbeeldinhoudVerplicht voor Canvas
CanvasRendert het voorbeeld in de editorOptioneel (.preview kan worden gebruikt)
SwiftUI ViewUI-componentVerplicht

Aanbeveling: schrijf PreviewProvider voor elke openbare View in het project. Dit versnelt de onboarding van nieuwe ontwikkelaars, vereenvoudigt code reviews en maakt snelle visuele controle van wijzigingen mogelijk zonder het hele project te bouwen.

Veelvoorkomende problemen met PreviewProvider

Probleem 1: Voorbeeld wordt niet bijgewerkt. Als Canvas codewijzigingen niet weerspiegelt, is de oorzaak meestal de DerivedData-cache. Maak DerivedData schoon via Product → Clean Build Folder (⇧⌘K) of door handmatig de map ~/Library/Developer/Xcode/DerivedData te verwijderen. Na het schonen bouwt Canvas het voorbeeld opnieuw op.

Probleem 2: PreviewProvider ziet @StateObject niet. PreviewProvider maakt een statische instantie van de View, dus afhankelijkheden die injectie vereisen (ViewModels, services) moeten via de initialisator of @StateObject met een standaardwaarde worden doorgegeven. Gebruik mock-objecten in plaats van echte services in het voorbeeld.

Probleem 3: Animaties werken niet in Canvas. Canvas ondersteunt niet alle SwiftUI-animaties – vooral die afhankelijk zijn van tijd (withAnimation met vertraging, .spring). Start de applicatie op de simulator om animaties te controleren. Canvas is geschikt voor statische layoutcontrole.

PreviewProvider met afhankelijkheden repareren

Afhankelijkheidsinjectie – de beste manier om PreviewProvider te laten werken met complexe ViewModels. Maak een aparte ViewModel-instantie met testgegevens en geef deze door aan de initialisator van de View.

swift
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-extensies: maak een extension voor ViewModel die statische .mock-instanties levert. Dit houdt testgegevens dicht bij de ViewModel en maakt PreviewProvider leesbaar.

Veelgestelde vragen

Is het verplicht om PreviewProvider voor elke View te schrijven?

Technisch gezien niet – de applicatie compileert ook zonder PreviewProvider. In de praktijk raden Apple en de SwiftUI-gemeenschap echter aan om voor elke openbare View een voorbeeld te schrijven. PreviewProvider versnelt de ontwikkeling, maakt snelle layoutcontrole op verschillende apparaten mogelijk en dient als visuele documentatie voor het team.

Waarom geeft PreviewProvider soms een compilatiefout?

PreviewProvider voegt alleen code toe aan de Debug-build, dus compilatiefouten kunnen optreden als in het voorbeeld typen worden gebruikt die niet beschikbaar zijn in de release-configuratie. Fouten treden ook op bij gebruik van @available met platforms die Canvas niet ondersteunen of bij overschrijding van de complexiteitslimiet van het voorbeeld.

Hoe geef ik gegevens van API door aan PreviewProvider?

Direct – op geen enkele manier, PreviewProvider werkt in isolatie. Gebruik mockgegevens: maak een statische extension van het model met .mock-instanties. Voor View met @StateObject geeft u ViewModel met testgegevens door via de initialisator. Dit simuleert echte gegevens zonder netwerkverzoeken.

Beïnvloedt PreviewProvider de uiteindelijke IPA-grootte?

Nee, PreviewProvider heeft geen invloed op de grootte van de release-binary. Xcode gebruikt conditionele compilatie (#if DEBUG / #if !RELEASE) om voorbeeldcode uit te sluiten van de release-build. PreviewProvider-code is alleen aanwezig in de Debug-configuratie en komt niet in de App Store-build terecht.

Kan ik PreviewProvider debuggen in Xcode?

Ja, Xcode ondersteunt het debuggen van voorbeelden. Plaats een breakpoint in previews of de View-code zelf en selecteer Product → Preview → Debug Preview. Daarna wordt het breakpoint geactiveerd tijdens het renderen van Canvas. Dit is handig voor het analyseren van layoutproblemen die alleen zichtbaar zijn in het voorbeeld.

Samenvatting

  • PreviewProvider – SwiftUI-protocol voor het maken van voorbeelden in Xcode Canvas met één eigenschap previews.
  • Meerdere voorbeelden – Group met ForEach maakt het mogelijk meerdere View-toestanden op verschillende apparaten weer te geven.
  • Modifiers – previewDevice, previewLayout, preferredColorScheme en dynamicTypeSize configureren de weergave.
  • Isolatie – PreviewProvider werkt alleen in de Debug-configuratie en heeft geen invloed op de uiteindelijke IPA-grootte.
  • Mockgegevens – gebruik statische .mock-instanties voor voorbeelden met complexe modellen.
  • UIKit-ondersteuning – via UIViewRepresentable werkt PreviewProvider ook met UIKit-componenten.

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook