PreviewProvider – co to je, protokol SwiftUI a konfigurace v Xcode

Autor: IT Sectr Publikováno: 2026-06-27 Doba čtení: 10 min

PreviewProvider – protokol SwiftUI, který definuje vstupní bod pro generování náhledů v Xcode Canvas. Implementace protokolu umožňuje vývojáři vidět rozhraní bez spouštění simulátoru, čímž urychluje iteraci ve fázi návrhu. Podle Apple Developer Documentation (2026) je PreviewProvider povinný pro všechny SwiftUI View, pokud projekt používá Canvas – bez něj Canvas nezobrazuje uživatelské rozhraní. Další informace naleznete v článku o SwiftUI.

Hlavní body

  • PreviewProvider – protokol SwiftUI pro generování náhledů Xcode v Canvas.
  • Jeden požadavek – protokol obsahuje jedinou vypočítanou vlastnost previews: some View.
  • Více náhledů – pomocí Group lze zobrazit několik stavů jednoho View.
  • Konfigurace zařízení – previewDevice, previewLayout a displayName konfigurují zobrazení.
  • Kompatibilita s UIKit – UIViewRepresentable a UIViewControllerRepresentable také podporují PreviewProvider.

Co je PreviewProvider?

PreviewProvider – protokol SwiftUI, který definuje kontrakt pro vytváření obsahu náhledu v Xcode Canvas. Protokol obsahuje jednu povinnou vlastnost: previews typu some View. Jakákoli hodnota vrácená previews se zobrazí v Canvas jako interaktivní náhled. PreviewProvider nevyžaduje dědičnost – stačí statická implementace v extension.

Architektonicky PreviewProvider není součástí běhového prostředí SwiftUI – je to výhradně vývojářský nástroj. Protokol je označen atributem @available(iOS 13.0, *) a není kompilován v release sestavení, protože Xcode používá podmíněný překlad k vyloučení kódu náhledu z produkce. To znamená, že PreviewProvider neovlivňuje velikost binárního souboru a výkon aplikace.

Protokol previews

Vlastnost previews – jediný požadavek PreviewProvider. Musí vrátit libovolné View: od jednoduchého Textu po složitou hierarchii s Group a ForEach. Xcode vykreslí vrácené View v Canvas s použitím systémových nastavení (téma, velikost, písmo).

swift
import SwiftUI

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

// PreviewProvider – statická implementace
struct GreetingView_Previews: PreviewProvider {
    static var previews: some View {
        GreetingView(name: "World")
    }
}

Konvence pojmenování: Apple doporučuje pojmenovat strukturu náhledu jako {ViewName}_Previews. Není to povinný požadavek kompilátoru, ale zlepšuje čitelnost a navigaci v projektu. Xcode automaticky dosadí tuto šablonu při vytváření nového SwiftUI souboru.

Jak funguje PreviewProvider: protokol a metoda previews

Mechanismus fungování PreviewProvider je založen na statickém odesílání: Xcode kompiluje extension s PreviewProvider pouze pro konfiguraci Debug a volá previews během procesu vytváření Canvas. Při každé změně kódu Xcode rekompiluje pouze změněné PreviewProvider, což zajišťuje téměř okamžitou aktualizaci náhledu.

SwiftUI nezaručuje přesnou shodu náhledu s konečným UI na simulátoru nebo zařízení – Canvas používá zjednodušené vykreslování. Animace se zpožděním se mohou zobrazovat nesprávně a některé UIKit komponenty (MapKit, WebView) se v Canvas nevykreslují bez dodatečné konfigurace.

Více náhledů pomocí Group

Group umožňuje současné zobrazení více stavů jednoho View, což urychluje iteraci při navrhování různých konfigurací. Každý náhled uvnitř Group je vykreslen nezávisle.

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 přidá popisek ke každému náhledu v Canvas, což je zvláště užitečné při porovnávání více stavů. Maximální počet náhledů v Group není omezen, ale více než 6–8 zpomaluje Canvas.

Konfigurace náhledu v Xcode

Xcode poskytuje několik modifikátorů pro konfiguraci zobrazení náhledu. Hlavní: previewDevice – emuluje konkrétní zařízení (iPhone 16 Pro, iPad Air, Apple Watch Ultra), previewLayout – nastavuje velikost (device, fixed, sizeThatFits). Kombinace těchto modifikátorů poskytuje plnou kontrolu nad prostředím náhledu.

previewDevice přijímá řetězec s názvem zařízení, například „iPhone 16 Pro" nebo „iPad Pro 13-inch (M4)". Seznam dostupných zařízení závisí na nainstalovaných simulátorech v Xcode. Pokud zařízení není nalezeno, Canvas zobrazí náhled na výchozím zařízení bez chyby.

ModifikátorPopisPříklad
previewDeviceEmulace zařízení.previewDevice(„iPhone 16 Pro")
previewLayoutRežim velikosti.previewLayout(.sizeThatFits)
previewDisplayNamePopisek náhledu.previewDisplayName(„Dark Mode")
preferredColorSchemeTéma designu.preferredColorScheme(.dark)
dynamicTypeSizeVelikost písma.dynamicTypeSize(.xxxLarge)

Náhledy pro různá zařízení

Běžná praxe – zobrazení jednoho View na několika zařízeních současně pro kontrolu responzivity. K tomu se používá ForEach s polem názvů zařízení.

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

Příklady PreviewProvider

Praktické příklady ukazují různé scénáře použití PreviewProvider: od jednoduchého náhledu po složité konfigurace s živými daty a kompatibilitou UIKit.

Náhled s mock daty

Mock data – standardní vzor pro náhled, když View přijímá model. Místo skutečného API se dosadí testovací data, což umožňuje vizuální kontrolu stavu UI bez spouštění aplikace.

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 náhled přes UIViewRepresentable

Kompatibilita s UIKit – PreviewProvider funguje také s UIKit komponentami zabalenými do UIViewRepresentable. To umožňuje náhled existujících UIKit pohledů v SwiftUI Canvas bez migrace celého projektu.

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

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

PreviewProvider a SwiftUI Canvas

Canvas – je vizuální editor Xcode, který vykresluje výsledek PreviewProvider v reálném čase. Bez implementace PreviewProvider zůstává Canvas prázdný. Canvas a PreviewProvider pracují v páru: PreviewProvider určuje, co zobrazit, Canvas – kde a jak.

Je důležité pochopit: Canvas – je prostředí pro spouštění náhledu, nikoli alternativa k PreviewProvider. I když vývojář neotevře Canvas, PreviewProvider lze použít pro rychlou kontrolu kódu prostřednictvím náhledu, který se zobrazí při najetí myší na ikonu Canvas. Podle WWDC 2024 Apple doporučuje psát PreviewProvider pro každé View jako vývojový standard, podobně jako psaní unit testů.

KomponentaRolePovinnost
PreviewProviderUrčuje obsah náhleduPovinné pro Canvas
CanvasVykresluje náhled v editoruVolitelné (lze použít .preview)
SwiftUI ViewUI komponentaPovinné

Doporučení: pište PreviewProvider pro každé veřejné View v projektu. To urychluje zaučení nových vývojářů, zjednodušuje code review a umožňuje rychlou kontrolu vizuálních změn bez sestavení celého projektu.

Typické problémy s PreviewProvider

Problém 1: Náhled se neaktualizuje. Pokud Canvas neodráží změny kódu, příčinou je obvykle mezipaměť DerivedData. Vyčistěte DerivedData přes Product → Clean Build Folder (⇧⌘K) nebo ručním smazáním složky ~/Library/Developer/Xcode/DerivedData. Po vyčištění Canvas znovu sestaví náhled od začátku.

Problém 2: PreviewProvider nevidí @StateObject. PreviewProvider vytváří statickou instanci View, proto závislosti vyžadující injekci (ViewModel, služby) musí být předány přes inicializátor nebo @StateObject s výchozí hodnotou. V náhledu používejte mock objekty místo skutečných služeb.

Problém 3: Animace nefungují v Canvas. Canvas nepodporuje všechny SwiftUI animace – zejména ty závislé na čase (withAnimation se zpožděním, .spring). Pro kontrolu animací spusťte aplikaci na simulátoru. Canvas je vhodný pro statickou kontrolu rozvržení.

Oprava PreviewProvider se závislostmi

Injekce závislostí – nejlepší způsob, jak zajistit fungování PreviewProvider se složitými ViewModel. Vytvořte samostatnou instanci ViewModel s testovacími daty a předejte ji do inicializátoru 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 rozšíření: vytvořte extension pro ViewModel, který poskytuje statické .mock instance. To udržuje testovací data poblíž ViewModel a činí PreviewProvider čitelným.

Často kladené otázky

Je nutné psát PreviewProvider pro každé View?

Technicky ne – aplikace se zkompiluje i bez PreviewProvider. V praxi však Apple a komunita SwiftUI doporučují psát náhledy pro každé veřejné View. PreviewProvider urychluje vývoj, umožňuje rychlou kontrolu rozvržení na různých zařízeních a slouží jako vizuální dokumentace pro tým.

Proč PreviewProvider někdy zobrazuje chybu kompilace?

PreviewProvider přidává kód pouze do Debug sestavení, takže chyby kompilace mohou nastat, pokud se v náhledu používají typy nedostupné v release konfiguraci. Chyby vznikají také při použití @available s platformami nepodporujícími Canvas nebo při překročení limitu složitosti náhledu.

Jak předat data z API do PreviewProvider?

Přímo – nijak, PreviewProvider běží v izolaci. Používejte mock data: vytvořte statické extension modelu s .mock instancemi. Pro View s @StateObject předejte ViewModel s testovacími daty přes inicializátor. To simuluje reálná data bez síťových požadavků.

Ovlivňuje PreviewProvider velikost výsledného IPA?

Ne, PreviewProvider neovlivňuje velikost release binárního souboru. Xcode používá podmíněný překlad (#if DEBUG / #if !RELEASE) k vyloučení kódu náhledu z release sestavení. Kód PreviewProvider existuje pouze v Debug konfiguraci a nedostává se do App Store sestavení.

Lze PreviewProvider ladit v Xcode?

Ano, Xcode podporuje ladění náhledů. Umístěte breakpoint uvnitř previews nebo samotného kódu View a vyberte Product → Preview → Debug Preview. Poté se breakpoint spustí při vykreslování Canvas. To je užitečné pro analýzu problémů s rozložením viditelných pouze v náhledu.

Shrnutí

  • PreviewProvider – protokol SwiftUI pro vytváření náhledů v Xcode Canvas s jedinou vlastností previews.
  • Více náhledů – Group s ForEach umožňuje zobrazit několik stavů View na různých zařízeních.
  • Modifikátory – previewDevice, previewLayout, preferredColorScheme a dynamicTypeSize konfigurují zobrazení.
  • Izolace – PreviewProvider funguje pouze v Debug konfiguraci a neovlivňuje velikost výsledného IPA.
  • Mock data – pro náhledy se složitými modely používejte statické .mock instance.
  • Podpora UIKit – přes UIViewRepresentable funguje PreviewProvider i s UIKit komponentami.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také