NavigationView: temeller, SwiftUI uygulamalarında navigasyon yığını

Yazar: IT Sectr Yayınlanma: 2026-02-22 Okuma süresi: 6 dk

NavigationView, ekranlar arasında yığın tabanlı navigasyonu düzenlemek için bir SwiftUI kapsayıcı bileşenidir. NavigationView, otomatik navigasyon çubuğu, başlık ve «Geri» düğmesi ile bir navigasyon yığını oluşturur. iOS 16'dan itibaren Apple, NavigationStack kullanılmasını önermektedir. Daha fazlasını Apple belgelerinde okuyun.

Önemli noktalar

  • NavigationView — yığın navigasyonu için SwiftUI kapsayıcısı, navigasyon çubuğu ve Geri düğmesi oluşturur
  • NavigationLink — NavigationView içinde yeni bir ekrana geçiş öğesi
  • NavigationStack — NavigationView'in halefi (iOS 16+), programatik yığın yönetimi ile
  • .toolbar — navigasyon çubuğuna düğme eklemek için değiştirici
  • .navigationTitle — ekran başlığını large veya inline stilinde ayarlar

NavigationView Nedir?

NavigationView, bir ekran hiyerarşisini saran ve bir navigasyon arayüzü sağlayan SwiftUI kapsayıcısıdır. NavigationView içinde NavigationLink çalışır — basıldığında mevcut ekranı yenisiyle değiştiren bir öğe. NavigationView otomatik olarak başlık ve «Geri» düğmesi ile bir navigasyon çubuğu ekler.

NavigationView, SwiftUI ile birlikte iOS 13'te ortaya çıktı. Kavramsal olarak UIKit'teki UINavigationController'ın yerini alır, ancak bildirimsel olarak uygulanır. Manuel push/pop yerine, geliştirici NavigationLink aracılığıyla ekranlar arasındaki ilişkiyi tanımlar. Sistem yığını otomatik olarak yönetir.

NavigationView, .navigationTitle, .navigationBarTitleDisplayMode, .toolbar ve .searchable değiştiricilerini destekler. iOS 16+ için Apple, NavigationView API'sini koruyan ancak NavigationPath aracılığıyla programatik yığın yönetimi ekleyen NavigationStack'i tanıttı. iOS 15 ve altını destekleyen projeler için NavigationView tek seçenek olmaya devam ediyor.

NavigationLink, NavigationView veya NavigationStack içinde hedef ekrana geçiş oluşturan bir SwiftUI öğesidir. NavigationLink'e basıldığında, sistem hedef ekranı navigasyon yığınına ekler. Geçiş animasyonu, iOS'ta sağdan standart push'tur ve platforma uyum sağlar.

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

struct DetailView: View {
    let item: Item

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

NavigationLink iki parametre alır: destination — hedef View ve label — kullanıcının bastığı öğe. Listeler için, value ve NavigationLink(value:) ile sözdizimi kullanışlıdır — hücreyi otomatik olarak seçimi kaldırır ve NavigationPath ile çalışır.

iOS 16 ile Apple, NavigationView'in yerine NavigationStack'i tanıttı. NavigationStack bildirimsel sözdizimini korur ancak kritik derecede önemli bir özellik ekler — NavigationPath türünde veya bir Hashable dizisi olan path özelliği aracılığıyla programatik yığın yönetimi.

ÖzellikNavigationView (iOS 13-15)NavigationStack (iOS 16+)
Programatik pushHayır, yalnızca NavigationLink ileEvet, path.append(value) ile
popToRootYalnızca köke dismisspath.removeLast(path.count)
Derin BağlantılarKarmaşık uygulamapath aracılığıyla yerleşik destek
Yığın tiplemesiHayır (destination'da herhangi bir View)Evet (Hashable değerler dizisi)
iPad SplitViewColumnStyle / StackStyleNavigationSplitView (iOS 16+)

Minimum sürümü iOS 16+ olan projeler için NavigationStack kullanın. iOS 14-15 desteği için — NavigationView. NavigationStack'in eski sürümler için doğrudan benzeri yoktur, bu nedenle yükseltme uyumluluk kontrolü gerektirir.

Toolbar ve navigationTitle Yapılandırması

.toolbar ve .navigationTitle değiştiricileri navigasyon çubuğunun içeriğini kontrol eder. .navigationTitle ekran başlığını ayarlar, .navigationBarTitleDisplayMode stili seçer: .large (büyük, varsayılan) veya .inline (kompakt, Ayarlar'daki gibi). .toolbar düğmeler, arama ve segmentli kontrol ekler.

swift
struct SettingsView: View {
    var body: some View {
        NavigationStack {
            Form {
                Section("Profil") {
                    Text("Kullanıcı adı")
                    Toggle("Bildirimler", isOn: $notifications)
                }
            }
            .navigationTitle("Ayarlar")
            .navigationBarTitleDisplayMode(.large)
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button("Kaydet") { save() }
                }
                ToolbarItem(placement: .navigationBarLeading) {
                    EditButton()
                }
            }
        }
    }
}

.searchable, navigasyon çubuğuna bir arama çubuğu entegre eden başka bir değiştiricidir. Hem NavigationView hem de NavigationStack ile çalışır. Kaydırma sırasında arama otomatik olarak gizlenir ve aşağı kaydırıldığında görünür. Binding String aracılığıyla liste filtrelemeyi destekler.

NavigationPath ile Programatik Navigasyon

NavigationPath, bir navigasyon yığınımı Hashable değerler koleksiyonu olarak temsil eden iOS 16+ türüdür. Geliştirici, programatik geçiş için path'e öğeler ekler, geri dönmek için kaldırır. NavigationPath, derin bağlantıları, push bildirimlerini ve durum geri yüklemeyi destekler.

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

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

        // Derin bağlantı ile programatik geçiş
        .onOpenURL { url in
            guard let productId = DeepLinkParser.parse(url) else { return }
            path.append(Product(id: productId))
        }
    }
}

.navigationDestination(for:), ekran gösterilecek veri türünü kaydeder. Bu türde bir değer path'e eklendiğinde, sistem otomatik olarak hedef View'i oluşturur. Bu yaklaşım, açık NavigationLink(destination:) yerine geçer ve navigasyonu sıkı türde yapar.

NavigationView ve NavigationStack tüm Apple platformlarında çalışır: iOS, iPadOS, watchOS, tvOS ve macOS. Davranış ekrana uyum sağlar. iPad'de NavigationStack, UIKit'teki UISplitViewController'ın yerini alan ve geniş ekranda iki sütun görüntüleyen NavigationSplitView'i destekler.

NavigationSplitView (iOS 16+), ekranı kenar çubuğu (liste) ve ayrıntı olarak böler. iPhone'da kenar çubuğu gizlenir ve yalnızca NavigationLink aracılığıyla ayrıntı gösterilir. iPad'de kenar çubuğu ve ayrıntı bölünmüş modda aynı anda görüntülenir.

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

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

NavigationSplitView, her cihaz için otomatik olarak en uygun görüntüleme modunu seçer. Dikey iPhone'da — yığın, yatay iPad ve iPhone'da — bölünmüş. Geliştiricinin farklı boyut sınıfları için ayrı kod yazması gerekmez.

Sıkça Sorulan Sorular

NavigationView ve NavigationStack arasındaki fark nedir?

NavigationView eski API'dir (iOS 13-15), yalnızca bildirimsel NavigationLink'i destekler. NavigationStack yeni API'dir (iOS 16+), programatik navigasyon, derin bağlantılar ve sıkı türde bir yığın için path ekler. Apple yeni projeler için NavigationStack'i önerir.

Navigasyon çubuğuna nasıl düğme eklenir?

.toolbar değiştiricisi ile ToolbarItem aracılığıyla. Örneğin: .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button('Ayarlar') { } } }. Placement konumu belirler: trailing (sağ), leading (sol), principal (orta).

Başlık ve stili nasıl yapılandırılır?

Başlık .navigationTitle('Başlık') ile ayarlanır. Stil — .navigationBarTitleDisplayMode(.large) veya .inline. Large — iOS Music stilinde büyük başlık, inline — Ayarlar'daki gibi kompakt. Stil her ekran için ayrı ayrı değiştirilebilir.

NavigationLink aracılığıyla veri nasıl iletilir?

Üç yol: value ile (NavigationLink(value:item) { Label }, iOS 16+), destination + label ile, programatik geçiş için isActive ile. Value ile NavigationLink, geçişten önce hedef View oluşturmayı gerektirmediği için listelerde daha temizdir.

NavigationView watchOS ve tvOS'ta kullanılabilir mi?

Evet. NavigationView ve NavigationStack iOS, iPadOS, watchOS, tvOS ve macOS'ta kullanılabilir. watchOS'ta navigasyon Digital Crown ile arayüz hiyerarşisini kullanır, tvOS'ta — uzaktan kumanda ile odak tabanlı giriş. Davranış platforma otomatik olarak uyum sağlar.

Özet

  • NavigationView — otomatik navigasyon çubuğu ve Geri düğmesi ile yığın navigasyonu için SwiftUI kapsayıcısı
  • NavigationLink — ana geçiş öğesi, bildirimsel (destination) ve value tabanlı sözdizimini destekler
  • NavigationStack (iOS 16+) NavigationView'in yerini alır, NavigationPath ile programatik yığın yönetimi ekler
  • .toolbar navigasyon çubuğuna düğmeler ekler, .navigationTitle large/inline stil seçimi ile başlığı ayarlar
  • NavigationPath — programatik navigasyon ve derin bağlantılar için Hashable değerlerin sıkı türde yığını
  • NavigationSplitView (iOS 16+) iPad ve iPhone için arayüzü uyarlar, otomatik olarak split veya yığın seçer
  • NavigationView ve NavigationStack arasındaki seçim, projedeki minimum desteklenen iOS sürümüne göre belirlenir

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun