NavigationView: conceitos básicos, pilha de navegação em apps SwiftUI

Autor: IT Sectr Publicado: 2026-02-22 Tempo de leitura: 6 min

NavigationView é um componente contentor SwiftUI para organizar navegação em pilha entre ecrãs. NavigationView cria uma pilha de navegação com barra de navegação automática, título e botão «Voltar». Desde o iOS 16, a Apple recomenda usar NavigationStack. Leia mais na documentação da Apple.

Pontos principais

  • NavigationView — contentor SwiftUI para navegação em pilha, cria barra de navegação e botão Voltar
  • NavigationLink — elemento de transição para um novo ecrã dentro do NavigationView
  • NavigationStack — sucessor do NavigationView (iOS 16+) com gestão programática da pilha
  • .toolbar — modificador para adicionar botões à barra de navegação
  • .navigationTitle — define o título do ecrã no estilo large ou inline

O que é NavigationView?

NavigationView é um contentor SwiftUI que envolve uma hierarquia de ecrãs e fornece uma interface de navegação. Dentro do NavigationView funciona o NavigationLink — um elemento que, ao ser pressionado, substitui o ecrã atual por um novo. NavigationView adiciona automaticamente uma barra de navegação com título e botão «Voltar».

NavigationView apareceu no iOS 13 juntamente com o SwiftUI. Conceptual mente, substitui o UINavigationController do UIKit, mas é implementado declarativamente. Em vez de push/pop manual, o desenvolvedor descreve a relação entre ecrãs através do NavigationLink. O sistema gere a pilha automaticamente.

NavigationView suporta os modificadores .navigationTitle, .navigationBarTitleDisplayMode, .toolbar e .searchable. Para iOS 16+, a Apple introduziu o NavigationStack, que preserva a API do NavigationView mas adiciona gestão programática da pilha através do NavigationPath. Para projetos com suporte até iOS 15, NavigationView continua a ser a única opção.

NavigationLink é um elemento SwiftUI que cria uma transição para um ecrã de destino dentro de NavigationView ou NavigationStack. Ao pressionar NavigationLink, o sistema adiciona o ecrã de destino à pilha de navegação. A animação de transição é o push padrão da direita no iOS, adaptando-se à plataforma.

swift
struct ContentView: View {
    var body: some View {
        NavigationView {
            List(items) { item in
                NavigationLink(destination: DetailView(item: item)) {
                    Text(item.title)
                }
            }
            .navigationTitle("Lista")
        }
    }
}

struct DetailView: View {
    let item: Item

    var body: some View {
        VStack {
            Text(item.description)
                .navigationTitle(item.title)
                .navigationBarTitleDisplayMode(.inline)
        }
    }
}

NavigationLink aceita dois parâmetros: destination — a View de destino, e label — o elemento que o utilizador pressiona. Para listas, a sintaxe com value e NavigationLink(value:) é conveniente — desmarca automaticamente a célula e funciona com NavigationPath.

Com o iOS 16, a Apple apresentou o NavigationStack como substituto do NavigationView. NavigationStack preserva a sintaxe declarativa mas adiciona uma funcionalidade criticamente importante — gestão programática da pilha através da propriedade path do tipo NavigationPath ou de um array de Hashable.

FuncionalidadeNavigationView (iOS 13-15)NavigationStack (iOS 16+)
Push programáticoNão, apenas via NavigationLinkSim, via path.append(value)
popToRootApenas dismiss até à raizpath.removeLast(path.count)
Deep LinksImplementação complexaSuporte integrado via path
Tipagem da pilhaNão (qualquer View em destination)Sim (array de valores Hashable)
SplitView iPadColumnStyle / StackStyleNavigationSplitView (iOS 16+)

Para projetos com versão mínima iOS 16+, use NavigationStack. Para suporte iOS 14-15 — NavigationView. NavigationStack não tem análogos diretos para versões antigas, por isso a atualização requer verificação de compatibilidade.

Toolbar e configuração do navigationTitle

Os modificadores .toolbar e .navigationTitle controlam o conteúdo da barra de navegação. .navigationTitle define o título do ecrã, .navigationBarTitleDisplayMode seleciona o estilo: .large (grande, padrão) ou .inline (compacto, como em Definições). .toolbar adiciona botões, pesquisa e controlo segmentado.

swift
struct SettingsView: View {
    var body: some View {
        NavigationStack {
            Form {
                Section("Perfil") {
                    Text("Nome de utilizador")
                    Toggle("Notificações", isOn: $notifications)
                }
            }
            .navigationTitle("Definições")
            .navigationBarTitleDisplayMode(.large)
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button("Guardar") { save() }
                }
                ToolbarItem(placement: .navigationBarLeading) {
                    EditButton()
                }
            }
        }
    }
}

.searchable é outro modificador que integra uma barra de pesquisa na barra de navegação. Funciona tanto com NavigationView como com NavigationStack. A pesquisa oculta-se automaticamente ao fazer scroll e aparece ao deslizar para baixo. Suporta filtragem de listas através de um Binding String.

Navegação programática com NavigationPath

NavigationPath é um tipo iOS 16+ que representa uma pilha de navegação como uma coleção de valores Hashable. O desenvolvedor adiciona elementos ao path para transições programáticas e remove-os para retroceder. NavigationPath suporta deep links, notificações push e restauração de estado.

swift
struct AppNavigation: View {
    @State private var path = NavigationPath()

    var body: some View {
        NavigationStack(path: $path) {
            List(categories) { category in
                NavigationLink("Categoria \(category.name)",
                               value: category)
            }
            .navigationTitle("Categorias")
            .navigationDestination(for: Category.self) { category in
                ProductListView(category: category)
            }
            .navigationDestination(for: Product.self) { product in
                ProductDetailView(product: product)
            }
        }

        // Navegação programática por deep link
        .onOpenURL { url in
            guard let productId = DeepLinkParser.parse(url) else { return }
            path.append(Product(id: productId))
        }
    }
}

.navigationDestination(for:) regista um tipo de dados para o qual mostrar um ecrã. Quando um valor deste tipo é adicionado ao path, o sistema cria automaticamente a View de destino. Esta abordagem substitui o NavigationLink(destination:) explícito e torna a navegação estritamente tipada.

NavigationView e NavigationStack funcionam em todas as plataformas Apple: iOS, iPadOS, watchOS, tvOS e macOS. O comportamento adapta-se ao ecrã. No iPad, NavigationStack suporta NavigationSplitView, que substitui o UISplitViewController do UIKit e exibe duas colunas num ecrã largo.

NavigationSplitView (iOS 16+) divide o ecrã em barra lateral (lista) e detalhe. No iPhone, a barra lateral fica oculta, mostrando apenas o detalhe através de NavigationLink. No iPad, a barra lateral e o detalhe são exibidos simultaneamente em modo split.

swift
struct AdaptiveNavigation: View {
    @State private var selectedCategory: Category?

    var body: some View {
        NavigationSplitView {
            List(categories, selection: $selectedCategory) { category in
                Text(category.name)
            }
            .navigationTitle("Categorias")
        } detail: {
            ProductListView(category: selectedCategory)
        }
    }
}

NavigationSplitView seleciona automaticamente o modo de visualização ideal para cada dispositivo. No iPhone em retrato — pilha, no iPad e iPhone em paisagem — split. O desenvolvedor não precisa escrever código separado para diferentes classes de tamanho.

Perguntas frequentes

Qual é a diferença entre NavigationView e NavigationStack?

NavigationView é a API antiga (iOS 13-15), suporta apenas NavigationLink declarativo. NavigationStack é a nova API (iOS 16+), adiciona path para navegação programática, deep links e uma pilha estritamente tipada. A Apple recomenda NavigationStack para novos projetos.

Como adicionar um botão ao navigationBar?

Através do modificador .toolbar com ToolbarItem. Por exemplo: .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button('Definições') { } } }. Placement determina a posição: trailing (direita), leading (esquerda), principal (centro).

Como configurar o título e o seu estilo?

O título é definido através de .navigationTitle('Título'). Estilo — .navigationBarTitleDisplayMode(.large) ou .inline. Large — título grande ao estilo iOS Music, inline — compacto, como em Definições. O estilo pode ser alterado para cada ecrã individualmente.

Como passar dados através de NavigationLink?

Três formas: através de value (NavigationLink(value:item) { Label }, iOS 16+), através de destination + label, através de isActive para transição programática. NavigationLink com value é mais limpo para listas, pois não requer criar a View de destino antes da transição.

Pode usar-se NavigationView no watchOS e tvOS?

Sim. NavigationView e NavigationStack estão disponíveis em iOS, iPadOS, watchOS, tvOS e macOS. No watchOS, a navegação usa a hierarquia de interface com a Digital Crown, no tvOS — entrada baseada em foco com o comando. O comportamento adapta-se à plataforma automaticamente.

Resumo

  • NavigationView — contentor SwiftUI para navegação em pilha com barra de navegação automática e botão Voltar
  • NavigationLink — o principal elemento de transição, suporta sintaxe declarativa (destination) e baseada em value
  • NavigationStack (iOS 16+) substitui NavigationView, adicionando gestão programática da pilha através de NavigationPath
  • .toolbar adiciona botões à barra de navegação, .navigationTitle define o título com seleção de estilo large/inline
  • NavigationPath — pilha estritamente tipada de valores Hashable para navegação programática e deep links
  • NavigationSplitView (iOS 16+) adapta a interface para iPad e iPhone, escolhendo automaticamente split ou pilha
  • A escolha entre NavigationView e NavigationStack é determinada pela versão mínima suportada do iOS no projeto

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