PreviewProvider – co to jest, protokół SwiftUI i konfiguracja w Xcode

Autor: IT Sectr Opublikowano: 2026-06-27 Czas czytania: 10 min

PreviewProvider – protokół SwiftUI, który definiuje punkt wejścia do generowania podglądów w Xcode Canvas. Implementacja protokołu pozwala programiście zobaczyć interfejs bez uruchamiania symulatora, przyspieszając iterację na etapie projektowania. Według Apple Developer Documentation (2026), PreviewProvider jest obowiązkowy dla wszystkich SwiftUI View, jeśli projekt używa Canvas – bez niego Canvas nie wyświetla interfejsu użytkownika. Dowiedz się więcej w artykule o SwiftUI.

Najważniejsze

  • PreviewProvider – protokół SwiftUI do generowania Xcode Preview w Canvas.
  • Jeden wymóg – protokół zawiera pojedynczą właściwość obliczaną previews: some View.
  • Wiele podglądów – przez Group można wyświetlić kilka stanów jednej View.
  • Konfiguracje urządzeń – previewDevice, previewLayout i displayName konfigurują wyświetlanie.
  • Zgodność z UIKit – UIViewRepresentable i UIViewControllerRepresentable również obsługują PreviewProvider.

Czym jest PreviewProvider?

PreviewProvider – protokół SwiftUI definiujący kontrakt do tworzenia treści podglądu w Xcode Canvas. Protokół zawiera jedną obowiązkową właściwość: previews typu some View. Każda wartość zwrócona przez previews jest wyświetlana w Canvas jako interaktywny podgląd. PreviewProvider nie wymaga dziedziczenia – wystarczy statyczna implementacja w extension.

Architektonicznie PreviewProvider nie jest częścią środowiska wykonawczego SwiftUI – to wyłącznie narzędzie programistyczne. Protokół jest oznaczony atrybutem @available(iOS 13.0, *) i nie jest kompilowany w wersji release, ponieważ Xcode używa kompilacji warunkowej do wykluczenia kodu podglądu z produkcji. Oznacza to, że PreviewProvider nie wpływa na rozmiar pliku binarnego ani wydajność aplikacji.

Protokół previews

Właściwość previews – jedyny wymóg PreviewProvider. Musi zwracać dowolną View: od prostego Text do złożonej hierarchii z Group i ForEach. Xcode renderuje zwróconą View w Canvas, stosując ustawienia systemowe (motyw, rozmiar, czcionkę).

swift
import SwiftUI

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

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

Konwencja nazewnictwa: Apple zaleca nazywanie struktury podglądu jako {ViewName}_Previews. Nie jest to obowiązkowy wymóg kompilatora, ale poprawia czytelność i nawigację po projekcie. Xcode automatycznie podstawia ten szablon przy tworzeniu nowego pliku SwiftUI.

Jak działa PreviewProvider: protokół i metoda previews

Mechanizm działania PreviewProvider opiera się na statycznym wysyłaniu: Xcode kompiluje extension z PreviewProvider tylko dla konfiguracji Debug i wywołuje previews podczas budowania Canvas. Przy każdej zmianie kodu Xcode rekompiluje tylko zmienione PreviewProvider, co zapewnia niemal natychmiastową aktualizację podglądu.

SwiftUI nie gwarantuje dokładnego dopasowania podglądu do końcowego UI na symulatorze lub urządzeniu – Canvas używa uproszczonego renderowania. Animacje z opóźnieniami mogą być wyświetlane nieprawidłowo, a niektóre komponenty UIKit (MapKit, WebView) nie są renderowane w Canvas bez dodatkowej konfiguracji.

Wiele podglądów przez Group

Group pozwala wyświetlić kilka stanów jednej View jednocześnie, co przyspiesza iterację podczas projektowania różnych konfiguracji. Każdy podgląd wewnątrz Group jest renderowany niezależnie.

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 dodaje etykietę do każdego podglądu w Canvas, co jest szczególnie przydatne przy porównywaniu wielu stanów. Maksymalna liczba podglądów w Group nie jest ograniczona, ale więcej niż 6–8 spowalnia Canvas.

Konfiguracja podglądu w Xcode

Xcode udostępnia kilka modyfikatorów do konfiguracji wyświetlania podglądu. Najważniejsze: previewDevice – emuluje konkretne urządzenie (iPhone 16 Pro, iPad Air, Apple Watch Ultra), previewLayout – ustawia rozmiar (device, fixed, sizeThatFits). Kombinacja tych modyfikatorów daje pełną kontrolę nad środowiskiem podglądu.

previewDevice przyjmuje ciąg znaków z nazwą urządzenia, na przykład „iPhone 16 Pro" lub „iPad Pro 13-inch (M4)". Lista dostępnych urządzeń zależy od zainstalowanych symulatorów w Xcode. Jeśli urządzenie nie zostanie znalezione, Canvas wyświetla podgląd na domyślnym urządzeniu bez błędu.

ModyfikatorOpisPrzykład
previewDeviceEmulacja urządzenia.previewDevice(„iPhone 16 Pro")
previewLayoutTryb rozmiaru.previewLayout(.sizeThatFits)
previewDisplayNameEtykieta podglądu.previewDisplayName(„Dark Mode")
preferredColorSchemeMotyw.preferredColorScheme(.dark)
dynamicTypeSizeRozmiar czcionki.dynamicTypeSize(.xxxLarge)

Podglądy dla różnych urządzeń

Powszechna praktyka – pokazywanie jednej View na kilku urządzeniach jednocześnie, aby sprawdzić responsywność. W tym celu używa się ForEach z tablicą nazw urządzeń.

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

Przykłady PreviewProvider

Praktyczne przykłady pokazują różne scenariusze użycia PreviewProvider: od prostego podglądu do złożonych konfiguracji z danymi live i zgodnością z UIKit.

Podgląd z danymi mock

Dane mock – standardowy wzorzec dla podglądu, gdy View przyjmuje model. Zamiast rzeczywistego API podstawiane są dane testowe, co pozwala wizualnie sprawdzić stan UI bez uruchamiania aplikacji.

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

Podgląd UIKit przez UIViewRepresentable

Zgodność z UIKit – PreviewProvider działa również z komponentami UIKit owiniętymi w UIViewRepresentable. Pozwala to na podgląd istniejących widoków UIKit w SwiftUI Canvas bez migracji całego projektu.

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

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

PreviewProvider i SwiftUI Canvas

Canvas – to wizualny edytor Xcode, który renderuje wynik działania PreviewProvider w czasie rzeczywistym. Bez implementacji PreviewProvider Canvas pozostaje pusty. Canvas i PreviewProvider działają w parze: PreviewProvider określa co pokazać, Canvas – gdzie i jak.

Ważne jest, aby zrozumieć: Canvas – to środowisko wykonawcze podglądu, a nie alternatywa dla PreviewProvider. Nawet jeśli programista nie otwiera Canvas, PreviewProvider może być używany do szybkiego sprawdzenia kodu przez podgląd po najechaniu na ikonę Canvas. Według WWDC 2024, Apple zaleca pisanie PreviewProvider dla każdej View jako standardu programowania, podobnie jak pisanie testów jednostkowych.

KomponentRolaObowiązkowość
PreviewProviderOkreśla treść podgląduObowiązkowy dla Canvas
CanvasRenderuje podgląd w edytorzeOpcjonalny (można użyć .preview)
SwiftUI ViewKomponent UIObowiązkowy

Zalecenie: pisz PreviewProvider dla każdej publicznej View w projekcie. Przyspiesza to wdrażanie nowych programistów, upraszcza code review i pozwala szybko sprawdzać zmiany wizualne bez budowania całego projektu.

Typowe problemy z PreviewProvider

Problem 1: Podgląd nie jest aktualizowany. Jeśli Canvas nie odzwierciedla zmian w kodzie, przyczyną najczęściej jest pamięć podręczna DerivedData. Wyczyść DerivedData przez Product → Clean Build Folder (⇧⌘K) lub ręcznie usuwając folder ~/Library/Developer/Xcode/DerivedData. Po czyszczeniu Canvas przebudowuje podgląd od nowa.

Problem 2: PreviewProvider nie widzi @StateObject. PreviewProvider tworzy statyczną instancję View, więc zależności wymagające wstrzyknięcia (ViewModel, serwisy) muszą być przekazywane przez inicjalizator lub @StateObject z domyślną wartością. Używaj obiektów mock zamiast rzeczywistych serwisów w podglądzie.

Problem 3: Animacje nie działają w Canvas. Canvas nie obsługuje wszystkich animacji SwiftUI – szczególnie tych zależnych od czasu (withAnimation z opóźnieniem, .spring). Do sprawdzania animacji uruchamiaj aplikację na symulatorze. Canvas nadaje się do statycznego sprawdzania layoutu.

Naprawa PreviewProvider z zależnościami

Wstrzykiwanie zależności – najlepszy sposób na działanie PreviewProvider ze złożonymi ViewModel. Utwórz osobną instancję ViewModel z danymi testowymi i przekaż ją do inicjalizatora 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)
    }
}

Rozszerzenia mock: utwórz extension dla ViewModel, który udostępnia statyczne instancje .mock. Pozwala to trzymać dane testowe obok ViewModel i czyni PreviewProvider czytelnym.

Często zadawane pytania

Czy konieczne jest pisanie PreviewProvider dla każdej View?

Technicznie nie – aplikacja skompiluje się również bez PreviewProvider. Jednak w praktyce Apple i społeczność SwiftUI zalecają pisanie podglądów dla każdej publicznej View. PreviewProvider przyspiesza rozwój, pozwala szybko sprawdzać layout na różnych urządzeniach i służy jako wizualna dokumentacja dla zespołu.

Dlaczego PreviewProvider czasami pokazuje błąd kompilacji?

PreviewProvider dodaje kod tylko do konfiguracji Debug, więc błędy kompilacji mogą wystąpić, jeśli w podglądzie są używane typy niedostępne w konfiguracji release. Błędy występują również przy użyciu @available z platformami nieobsługującymi Canvas lub przy przekroczeniu limitu złożoności podglądu.

Jak przekazać dane z API do PreviewProvider?

Bezpośrednio – nie ma takiej możliwości, PreviewProvider działa w izolacji. Używaj danych mock: utwórz statyczne extension modelu z instancjami .mock. Dla View z @StateObject przekazuj ViewModel z danymi testowymi przez inicjalizator. To symuluje rzeczywiste dane bez zapytań sieciowych.

Czy PreviewProvider wpływa na rozmiar końcowego IPA?

Nie, PreviewProvider nie wpływa na rozmiar pliku binarnego wersji release. Xcode używa kompilacji warunkowej (#if DEBUG / #if !RELEASE) do wykluczenia kodu podglądu z wersji release. Kod PreviewProvider występuje tylko w konfiguracji Debug i nie trafia do buildu App Store.

Czy można debugować PreviewProvider w Xcode?

Tak, Xcode obsługuje debugowanie podglądów. Ustaw breakpoint wewnątrz previews lub samego kodu View i wybierz Product → Preview → Debug Preview. Po tym breakpoint zadziała podczas renderowania Canvas. Jest to przydatne do analizy problemów z layoutem, które są widoczne tylko w podglądzie.

Podsumowanie

  • PreviewProvider – protokół SwiftUI do tworzenia podglądów w Xcode Canvas z pojedynczą właściwością previews.
  • Wiele podglądów – Group z ForEach pozwala wyświetlić kilka stanów View na różnych urządzeniach.
  • Modyfikatory – previewDevice, previewLayout, preferredColorScheme i dynamicTypeSize konfigurują wyświetlanie.
  • Izolacja – PreviewProvider działa tylko w konfiguracji Debug i nie wpływa na rozmiar końcowego IPA.
  • Dane mock – dla podglądów ze złożonymi modelami używaj statycznych instancji .mock.
  • Obsługa UIKit – przez UIViewRepresentable PreviewProvider działa również z komponentami UIKit.

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również