PreviewProvider — apa itu, protokol SwiftUI dan konfigurasi di Xcode

Penulis: IT Sectr Diterbitkan: 2026-06-27 Waktu membaca: 10 mnt

PreviewProvider — protokol SwiftUI yang mendefinisikan titik masuk untuk menghasilkan pratinjau di Xcode Canvas. Implementasi protokol memungkinkan pengembang melihat antarmuka tanpa menjalankan simulator, mempercepat iterasi pada tahap desain. Menurut Apple Developer Documentation (2026), PreviewProvider wajib untuk semua SwiftUI View jika proyek menggunakan Canvas — tanpanya Canvas tidak menampilkan antarmuka pengguna. Pelajari lebih lanjut di artikel tentang SwiftUI.

Poin Utama

  • PreviewProvider — protokol SwiftUI untuk menghasilkan pratinjau Xcode di Canvas.
  • Satu persyaratan — protokol berisi satu properti terhitung previews: some View.
  • Pratinjau ganda — melalui Group dapat menampilkan beberapa status dari satu View.
  • Konfigurasi perangkat — previewDevice, previewLayout dan displayName mengonfigurasi tampilan.
  • Kompatibilitas UIKit — UIViewRepresentable dan UIViewControllerRepresentable juga mendukung PreviewProvider.

Apa itu PreviewProvider?

PreviewProvider — protokol SwiftUI yang mendefinisikan kontrak untuk membuat konten pratinjau di Xcode Canvas. Protokol berisi satu properti wajib: previews bertipe some View. Nilai apa pun yang dikembalikan oleh previews ditampilkan di Canvas sebagai pratinjau interaktif. PreviewProvider tidak memerlukan pewarisan — implementasi statis di extension sudah cukup.

Secara arsitektur, PreviewProvider bukan bagian dari runtime SwiftUI — ini semata-mata alat pengembangan. Protokol ditandai dengan atribut @available(iOS 13.0, *) dan tidak dikompilasi dalam build rilis, karena Xcode menggunakan kompilasi bersyarat untuk mengecualikan kode pratinjau dari produksi. Ini berarti PreviewProvider tidak memengaruhi ukuran biner dan kinerja aplikasi.

Protokol previews

Properti previews — satu-satunya persyaratan PreviewProvider. Harus mengembalikan View apa pun: dari Text sederhana hingga hierarki kompleks dengan Group dan ForEach. Xcode merender View yang dikembalikan di Canvas, menerapkan pengaturan sistem (tema, ukuran, font).

swift
import SwiftUI

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

// PreviewProvider — implementasi statis
struct GreetingView_Previews: PreviewProvider {
    static var previews: some View {
        GreetingView(name: "World")
    }
}

Konvensi penamaan: Apple merekomendasikan penamaan struktur pratinjau sebagai {ViewName}_Previews. Ini bukan persyaratan wajib kompiler, tetapi meningkatkan keterbacaan dan navigasi proyek. Xcode secara otomatis mengganti template ini saat membuat file SwiftUI baru.

Cara kerja PreviewProvider: protokol dan metode previews

Mekanisme kerja PreviewProvider didasarkan pada pengiriman statis: Xcode mengompilasi extension dengan PreviewProvider hanya untuk konfigurasi Debug dan memanggil previews selama proses pembuatan Canvas. Setiap kali kode berubah, Xcode hanya mengompilasi ulang PreviewProvider yang diubah, memastikan pembaruan pratinjau hampir seketika.

SwiftUI tidak menjamin kecocokan persis pratinjau dengan UI akhir pada simulator atau perangkat — Canvas menggunakan rendering yang disederhanakan. Animasi dengan penundaan mungkin ditampilkan secara tidak benar, dan beberapa komponen UIKit (MapKit, WebView) tidak dirender di Canvas tanpa konfigurasi tambahan.

Pratinjau ganda melalui Group

Group memungkinkan menampilkan beberapa status dari satu View secara bersamaan, yang mempercepat iterasi saat mendesain berbagai konfigurasi. Setiap pratinjau di dalam Group dirender secara independen.

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 menambahkan label ke setiap pratinjau di Canvas, yang sangat berguna saat membandingkan beberapa status. Jumlah maksimum pratinjau di Group tidak terbatas, tetapi lebih dari 6–8 memperlambat Canvas.

Konfigurasi pratinjau di Xcode

Xcode menyediakan beberapa pengubah untuk mengonfigurasi tampilan pratinjau. Yang utama: previewDevice — meniru perangkat tertentu (iPhone 16 Pro, iPad Air, Apple Watch Ultra), previewLayout — mengatur ukuran (device, fixed, sizeThatFits). Kombinasi pengubah ini memberikan kendali penuh atas lingkungan pratinjau.

previewDevice menerima string dengan nama perangkat, misalnya “iPhone 16 Pro” atau “iPad Pro 13-inch (M4)”. Daftar perangkat yang tersedia tergantung pada simulator yang terinstal di Xcode. Jika perangkat tidak ditemukan, Canvas menampilkan pratinjau pada perangkat default tanpa kesalahan.

PengubahDeskripsiContoh
previewDeviceEmulasi perangkat.previewDevice(“iPhone 16 Pro”)
previewLayoutMode ukuran.previewLayout(.sizeThatFits)
previewDisplayNameLabel pratinjau.previewDisplayName(“Dark Mode”)
preferredColorSchemeTema desain.preferredColorScheme(.dark)
dynamicTypeSizeUkuran font.dynamicTypeSize(.xxxLarge)

Pratinjau untuk berbagai perangkat

Praktik umum — menampilkan satu View di beberapa perangkat secara bersamaan untuk memeriksa responsivitas. Untuk ini, ForEach dengan array nama perangkat digunakan.

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

Contoh PreviewProvider

Contoh praktis menunjukkan berbagai skenario penggunaan PreviewProvider: dari pratinjau sederhana hingga konfigurasi kompleks dengan data langsung dan kompatibilitas UIKit.

Pratinjau dengan data tiruan

Data tiruan — pola standar untuk pratinjau saat View menerima model. Alih-alih API nyata, data uji disubstitusi, memungkinkan pemeriksaan visual status UI tanpa menjalankan aplikasi.

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

Pratinjau UIKit melalui UIViewRepresentable

Kompatibilitas UIKit — PreviewProvider juga berfungsi dengan komponen UIKit yang dibungkus dalam UIViewRepresentable. Ini memungkinkan pratinjau tampilan UIKit yang ada di SwiftUI Canvas tanpa migrasi seluruh proyek.

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

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

PreviewProvider dan SwiftUI Canvas

Canvas — adalah editor visual Xcode yang merender hasil PreviewProvider secara real-time. Tanpa implementasi PreviewProvider, Canvas tetap kosong. Canvas dan PreviewProvider bekerja berpasangan: PreviewProvider menentukan apa yang ditampilkan, Canvas — di mana dan bagaimana.

Penting untuk dipahami: Canvas — adalah lingkungan eksekusi pratinjau, bukan alternatif untuk PreviewProvider. Bahkan jika pengembang tidak membuka Canvas, PreviewProvider dapat digunakan untuk pemeriksaan kode cepat melalui pratinjau yang muncul saat mengarahkan kursor ke ikon Canvas. Menurut WWDC 2024, Apple merekomendasikan penulisan PreviewProvider untuk setiap View sebagai standar pengembangan, mirip dengan penulisan unit test.

KomponenPeranKewajiban
PreviewProviderMenentukan konten pratinjauWajib untuk Canvas
CanvasMerender pratinjau di editorOpsional (.preview dapat digunakan)
SwiftUI ViewKomponen UIWajib

Rekomendasi: tulis PreviewProvider untuk setiap View publik di proyek. Ini mempercepat orientasi pengembang baru, menyederhanakan tinjauan kode, dan memungkinkan pemeriksaan cepat perubahan visual tanpa membangun seluruh proyek.

Masalah umum dengan PreviewProvider

Masalah 1: Pratinjau tidak diperbarui. Jika Canvas tidak mencerminkan perubahan kode, penyebabnya biasanya adalah cache DerivedData. Bersihkan DerivedData melalui Product → Clean Build Folder (⇧⌘K) atau dengan menghapus folder ~/Library/Developer/Xcode/DerivedData secara manual. Setelah pembersihan, Canvas membangun ulang pratinjau dari awal.

Masalah 2: PreviewProvider tidak melihat @StateObject. PreviewProvider membuat instance statis View, sehingga dependensi yang memerlukan injeksi (ViewModel, layanan) harus diteruskan melalui penginisialisasi atau @StateObject dengan nilai default. Gunakan objek tiruan alih-alih layanan nyata dalam pratinjau.

Masalah 3: Animasi tidak berfungsi di Canvas. Canvas tidak mendukung semua animasi SwiftUI — terutama yang bergantung pada waktu (withAnimation dengan penundaan, .spring). Untuk memeriksa animasi, jalankan aplikasi di simulator. Canvas cocok untuk pemeriksaan tata letak statis.

Memperbaiki PreviewProvider dengan dependensi

Injeksi dependensi — cara terbaik untuk membuat PreviewProvider berfungsi dengan ViewModel kompleks. Buat instance ViewModel terpisah dengan data uji dan teruskan ke penginisialisasi 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)
    }
}

Ekstensi tiruan: buat extension untuk ViewModel yang menyediakan instance .mock statis. Ini menjaga data uji tetap dekat dengan ViewModel dan membuat PreviewProvider mudah dibaca.

Pertanyaan yang Sering Diajukan

Apakah wajib menulis PreviewProvider untuk setiap View?

Secara teknis tidak — aplikasi akan dikompilasi tanpa PreviewProvider. Namun dalam praktiknya, Apple dan komunitas SwiftUI merekomendasikan penulisan pratinjau untuk setiap View publik. PreviewProvider mempercepat pengembangan, memungkinkan pemeriksaan tata letak cepat di berbagai perangkat, dan berfungsi sebagai dokumentasi visual untuk tim.

Mengapa PreviewProvider terkadang menampilkan kesalahan kompilasi?

PreviewProvider menambahkan kode hanya ke build Debug, sehingga kesalahan kompilasi dapat terjadi jika dalam pratinjau digunakan tipe yang tidak tersedia dalam konfigurasi rilis. Kesalahan juga terjadi saat menggunakan @available dengan platform yang tidak mendukung Canvas, atau saat melampaui batas kompleksitas pratinjau.

Bagaimana cara meneruskan data dari API ke PreviewProvider?

Secara langsung — tidak bisa, PreviewProvider berjalan dalam isolasi. Gunakan data tiruan: buat extension statis model dengan instance .mock. Untuk View dengan @StateObject, teruskan ViewModel dengan data uji melalui penginisialisasi. Ini mensimulasikan data nyata tanpa permintaan jaringan.

Apakah PreviewProvider memengaruhi ukuran IPA akhir?

Tidak, PreviewProvider tidak memengaruhi ukuran biner rilis. Xcode menggunakan kompilasi bersyarat (#if DEBUG / #if !RELEASE) untuk mengecualikan kode pratinjau dari build rilis. Kode PreviewProvider hanya ada dalam konfigurasi Debug dan tidak masuk ke build App Store.

Bisakah PreviewProvider di-debug di Xcode?

Ya, Xcode mendukung debug pratinjau. Tempatkan breakpoint di dalam previews atau kode View itu sendiri dan pilih Product → Preview → Debug Preview. Setelah itu, breakpoint akan terpicu saat rendering Canvas. Ini berguna untuk menganalisis masalah tata letak yang hanya terlihat dalam pratinjau.

Ringkasan

  • PreviewProvider — protokol SwiftUI untuk membuat pratinjau di Xcode Canvas dengan satu properti previews.
  • Pratinjau ganda — Group dengan ForEach memungkinkan menampilkan beberapa status View di berbagai perangkat.
  • Pengubah — previewDevice, previewLayout, preferredColorScheme dan dynamicTypeSize mengonfigurasi tampilan.
  • Isolasi — PreviewProvider hanya bekerja dalam konfigurasi Debug dan tidak memengaruhi ukuran IPA akhir.
  • Data tiruan — untuk pratinjau dengan model kompleks, gunakan instance .mock statis.
  • Dukungan UIKit — melalui UIViewRepresentable, PreviewProvider juga berfungsi dengan komponen UIKit.

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga