PreviewProvider — o que é, protocolo SwiftUI e configuração no Xcode

Autor: IT Sectr Publicado: 2026-06-27 Tempo de leitura: 10 min

PreviewProvider é um protocolo SwiftUI que define o ponto de entrada para gerar pré-visualizações no Xcode Canvas. A implementação do protocolo permite que o desenvolvedor veja a interface sem iniciar o simulador, acelerando a iteração durante a fase de layout. De acordo com a Apple Developer Documentation (2026), o PreviewProvider é obrigatório para todas as SwiftUI View se o projeto usar o Canvas — sem ele, o Canvas não exibe a interface do utilizador. Saiba mais no artigo sobre SwiftUI.

Principais pontos

  • PreviewProvider — um protocolo SwiftUI para gerar pré-visualização do Xcode no Canvas.
  • Único requisito — o protocolo contém apenas uma propriedade computada previews: some View.
  • Múltiplas pré-visualizações — Group pode exibir vários estados de uma mesma View.
  • Configurações de dispositivo — previewDevice, previewLayout e displayName configuram a exibição.
  • Compatibilidade UIKit — UIViewRepresentable e UIViewControllerRepresentable também suportam PreviewProvider.

O que é PreviewProvider?

PreviewProvider é um protocolo SwiftUI que define um contrato para criar conteúdo de pré-visualização no Xcode Canvas. O protocolo contém uma única propriedade obrigatória: previews do tipo some View. Qualquer valor retornado por previews é exibido no Canvas como uma pré-visualização interativa. O PreviewProvider não requer herança — basta uma implementação estática numa extensão.

Arquiteturalmente, o PreviewProvider não faz parte do runtime SwiftUI — é exclusivamente uma ferramenta de desenvolvimento. O protocolo está marcado com o atributo @available(iOS 13.0, *) e não é compilado na versão de lançamento, pois o Xcode usa compilação condicional para excluir o código de pré-visualização da produção. Isso significa que o PreviewProvider não afeta o tamanho do binário nem o desempenho da aplicação.

O protocolo previews

A propriedade previews é o único requisito do PreviewProvider. Deve retornar qualquer View: desde um simples Text até uma hierarquia complexa com Group e ForEach. O Xcode renderiza a View retornada no Canvas, aplicando as configurações do sistema (tema, tamanho, fonte).

swift
import SwiftUI

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

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

Convenção de nomenclatura: a Apple recomenda nomear a estrutura de pré-visualização como {ViewName}_Previews. Não é um requisito do compilador, mas melhora a legibilidade e a navegação no projeto. O Xcode insere automaticamente este modelo ao criar um novo ficheiro SwiftUI.

Como funciona o PreviewProvider: protocolo e método previews

O mecanismo de funcionamento do PreviewProvider baseia-se em despacho estático: o Xcode compila a extensão PreviewProvider apenas para a configuração Debug e chama previews durante o processo de construção do Canvas. Cada vez que o código muda, o Xcode recompila apenas os PreviewProviders modificados, garantindo atualizações quase instantâneas da pré-visualização.

SwiftUI não garante uma correspondência exata entre a pré-visualização e a interface final num simulador ou dispositivo — o Canvas utiliza renderização simplificada. Animações com atrasos podem ser exibidas incorretamente e alguns componentes UIKit (MapKit, WebView) não são renderizados no Canvas sem configuração adicional.

Múltiplas pré-visualizações através de Group

Group permite exibir vários estados de uma mesma View simultaneamente, acelerando a iteração ao criar diferentes configurações. Cada pré-visualização dentro de Group é renderizada independentemente.

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 adiciona uma etiqueta a cada pré-visualização no Canvas, o que é especialmente útil ao comparar vários estados. O número máximo de pré-visualizações em Group não é limitado, mas mais de 6–8 tornam o Canvas mais lento.

Configuração de pré-visualizações no Xcode

O Xcode fornece vários modificadores para configurar a exibição da pré-visualização. Os principais: previewDevice — simula um dispositivo específico (iPhone 16 Pro, iPad Air, Apple Watch Ultra), previewLayout — define o tamanho (device, fixed, sizeThatFits). A combinação destes modificadores dá controlo total sobre o ambiente de pré-visualização.

previewDevice aceita uma string com o nome do dispositivo, por exemplo "iPhone 16 Pro" ou "iPad Pro 13-inch (M4)". A lista de dispositivos disponíveis depende dos simuladores instalados no Xcode. Se o dispositivo não for encontrado, o Canvas exibe a pré-visualização no dispositivo predefinido sem erro.

ModificadorDescriçãoExemplo
previewDeviceSimulação de dispositivo.previewDevice("iPhone 16 Pro")
previewLayoutModo de tamanho.previewLayout(.sizeThatFits)
previewDisplayNameEtiqueta da pré-visualização.previewDisplayName("Dark Mode")
preferredColorSchemeEsquema de cores.preferredColorScheme(.dark)
dynamicTypeSizeTamanho da fonte.dynamicTypeSize(.xxxLarge)

Pré-visualizações para diferentes dispositivos

Prática comum é exibir uma mesma View em vários dispositivos simultaneamente para verificar a adaptabilidade. Para tal, utiliza-se ForEach com um array de nomes de dispositivos.

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

Exemplos de PreviewProvider

Exemplos práticos mostram vários cenários de utilização do PreviewProvider: desde pré-visualizações simples até configurações complexas com dados reais e compatibilidade UIKit.

Pré-visualização com dados simulados

Dados simulados são um padrão standard para pré-visualizações quando uma View aceita um modelo. Em vez de uma API real, são substituídos dados de teste, permitindo a verificação visual do estado da interface sem iniciar a aplicação.

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

Pré-visualização UIKit através de UIViewRepresentable

Compatibilidade UIKit — o PreviewProvider também funciona com componentes UIKit encapsulados em UIViewRepresentable. Isto permite pré-visualizar vistas UIKit existentes no SwiftUI Canvas sem migrar todo o projeto.

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

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

PreviewProvider e SwiftUI Canvas

Canvas é o editor visual do Xcode que renderiza a saída do PreviewProvider em tempo real. Sem uma implementação PreviewProvider, o Canvas permanece vazio. Canvas e PreviewProvider funcionam em conjunto: PreviewProvider define o que mostrar, Canvas define onde e como.

É importante entender: Canvas é o ambiente de execução da pré-visualização, não uma alternativa ao PreviewProvider. Mesmo que o desenvolvedor não abra o Canvas, o PreviewProvider pode ser usado para verificação rápida do código através da pré-visualização popup ao passar o rato sobre o ícone do Canvas. De acordo com a WWDC 2024, a Apple recomenda escrever PreviewProvider para cada View como padrão de desenvolvimento, semelhante à escrita de testes unitários.

ComponenteFunçãoObrigatoriedade
PreviewProviderDefine o conteúdo da pré-visualizaçãoObrigatório para Canvas
CanvasRenderiza a pré-visualização no editorOpcional (pode usar .preview)
SwiftUI ViewComponente de interfaceObrigatório

Recomendação: escreva PreviewProvider para cada View pública no projeto. Isto acelera a integração de novos programadores, simplifica a revisão de código e permite verificar rapidamente alterações visuais sem compilar todo o projeto.

Problemas comuns com PreviewProvider

Problema 1: A pré-visualização não atualiza. Se o Canvas não refletir as alterações de código, a causa é geralmente a cache DerivedData. Limpe a DerivedData através de Product → Clean Build Folder (⇧⌘K) ou apagando manualmente a pasta ~/Library/Developer/Xcode/DerivedData. Após a limpeza, o Canvas reconstrói a pré-visualização de raiz.

Problema 2: PreviewProvider não vê @StateObject. O PreviewProvider cria uma instância estática da View, pelo que as dependências que requerem injeção (ViewModels, serviços) devem ser passadas através do inicializador ou @StateObject com um valor predefinido. Use objetos simulados em vez de serviços reais nas pré-visualizações.

Problema 3: Animações não funcionam no Canvas. O Canvas não suporta todas as animações SwiftUI — especialmente as que dependem de temporização (withAnimation com atraso, .spring). Para testar animações, execute a aplicação num simulador. O Canvas é adequado para verificação estática de layout.

Corrigir PreviewProvider com dependências

Injeção de dependências é a melhor forma de fazer o PreviewProvider funcionar com ViewModels complexos. Crie uma instância separada do ViewModel com dados de teste e passe-a para o inicializador da 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)
    }
}

Extensões simuladas: crie uma extensão para o ViewModel que forneça instâncias .mock estáticas. Isto mantém os dados de teste perto do ViewModel e torna o PreviewProvider legível.

Perguntas frequentes

É obrigatório escrever PreviewProvider para cada View?

Tecnicamente não — a aplicação compila sem PreviewProvider. No entanto, na prática, a Apple e a comunidade SwiftUI recomendam escrever pré-visualizações para cada View pública. O PreviewProvider acelera o desenvolvimento, permite verificar rapidamente o layout em diferentes dispositivos e serve como documentação visual para a equipa.

Porque é que o PreviewProvider mostra por vezes um erro de compilação?

O PreviewProvider adiciona código apenas em compilações Debug, pelo que podem ocorrer erros de compilação se a pré-visualização usar tipos indisponíveis na configuração de lançamento. Ocorrem também erros ao usar @available com plataformas que não suportam Canvas, ou ao exceder o limite de complexidade da pré-visualização.

Como passar dados de uma API para o PreviewProvider?

Diretamente — não é possível, o PreviewProvider é executado isoladamente. Use dados simulados: crie uma extensão estática do modelo com instâncias .mock. Para Views com @StateObject, passe um ViewModel com dados de teste através do inicializador. Isto simula dados reais sem pedidos de rede.

O PreviewProvider afeta o tamanho final do IPA?

Não, o PreviewProvider não afeta o tamanho do binário de lançamento. O Xcode usa compilação condicional (#if DEBUG / #if !RELEASE) para excluir o código de pré-visualização das compilações de lançamento. O código PreviewProvider existe apenas na configuração Debug e não vai para as compilações da App Store.

É possível depurar o PreviewProvider no Xcode?

Sim, o Xcode suporta depuração de pré-visualizações. Defina um breakpoint dentro de previews ou do próprio código da View e selecione Product → Preview → Debug Preview. O breakpoint será ativado durante a renderização do Canvas. Isto é útil para analisar problemas de layout que só são visíveis nas pré-visualizações.

Resumo

  • PreviewProvider — um protocolo SwiftUI para criar pré-visualizações no Xcode Canvas com uma única propriedade previews.
  • Múltiplas pré-visualizações — Group com ForEach permite exibir vários estados da View em diferentes dispositivos.
  • Modificadores — previewDevice, previewLayout, preferredColorScheme e dynamicTypeSize configuram a exibição.
  • Isolamento — PreviewProvider funciona apenas na configuração Debug e não afeta o tamanho do IPA de lançamento.
  • Dados simulados — para pré-visualizações com modelos complexos, use instâncias .mock estáticas.
  • Suporte UIKit — através de UIViewRepresentable, PreviewProvider também funciona com componentes UIKit.

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também