NavigationLink — nedir, SwiftUI'de geçiş düğmesi

Yazar: IT Sectr Yayınlanma: 2026-06-25 Okuma süresi: 6 dk

NavigationLink, NavigationStack veya NavigationView'da başka bir ekrana geçiş yapmak için tasarlanmış bir SwiftUI kontrol öğesidir. Apple Developer Documentation, 2024'e göre NavigationLink, basıldığında hedef View'i navigasyon yığınına yerleştiren bir düğme oluşturur. iOS 16+'da, hedef View'ların erken başlatılmasını önlemek için doğrudan destination yerine value ve NavigationDestination ile NavigationLink kullanılması önerilir.

Önemli Noktalar

  • NavigationLink — SwiftUI'de başka bir ekrana gitmek için düğme
  • İki biçim — destination:label: ve value:label: ile
  • Value biçimi iOS 16+'da (NavigationStack) önerilir
  • Destination biçimi View'in erken başlatılmasına neden olur
  • Otomatik açıklama oku List'te

NavigationLink, basıldığında bir navigasyon geçişi başlatan View'dir. NavigationStack içinde NavigationLink'e basmak, hedef ekranı yığına yerleştirir ve sistem Geri düğmesini gösterir. NavigationLink, iOS 13'ten beri mevcuttur ve SwiftUI'de kullanıcı navigasyonunun birincil yöntemidir.

NavigationLink, UIButton'dan miras almaz — bağlama otomatik olarak uyum sağlayan bir SwiftUI View'dir. List içinde NavigationLink, bir açıklama göstergesi ile görüntülenir. Bir listenin dışında NavigationLink, normal bir düğme gibi davranır ancak navigasyon davranışına sahiptir.

SwiftUI Lab (2024)'e göre NavigationLink, SwiftUI uygulamalarında en çok kullanılan View'lerden biridir ve yalnızca Text, Image ve VStack'ten sonra gelir. Başlatma biçimleri arasındaki farkları anlamak, performans ve öngörülebilir navigasyon davranışı için kritiktir.

NavigationLink'in iç çalışması

Basıldığında NavigationLink, en yakın NavigationStack veya NavigationView ile ilişkili navigasyon yığına bir değer (veya destination) ekler. SwiftUI, View hiyerarşisi boyunca navigasyon yolunu iletmek için EnvironmentValue'yu kullanır. NavigationLink bu yolu Environment'dan okur ve basıldığında onu değiştirir.

NavigationLink'in iki ana biçimi vardır: destination ile (hedef View'i doğrudan belirtme) ve value ile (NavigationDestination için değer). Biçim seçimi iOS sürümüne ve navigasyon mimarisine bağlıdır.

BiçimBaşlatıcıiOS 13–15iOS 16+
DestinationNavigationLink(destination:label:)ÖnerilirÖnerilmez
ValueNavigationLink(value:label:)KullanılamazÖnerilir
IsActiveNavigationLink(isActive:destination:label:)Programlı navigasyonÖnerilmez

Destination biçimi (iOS 13+): NavigationLink(destination: DetailView(), label: { Text("Open") }). Bu biçim, kullanıcı bağlantıya tıklamamış olsa bile NavigationLink'i işlerken hemen DetailView oluşturur. Bu, View'in erken başlatılmasına ve hedef View başlatıcısında ağır işlemler gerçekleştiriyorsa potansiyel performans sorunlarına yol açar.

Value biçimi (iOS 16+): NavigationLink(value: "detail_42", label: { Text("Open") }). Hedef View yalnızca bağlantı basıldığında, SwiftUI ilgili .navigationDestination'i bulduğunda oluşturulur. Bu, erken başlatmayı önler ve navigasyonu daha öngörülebilir hale getirir.

NavigationStack ile NavigationLink iOS 16+'da value biçimine geçiş gerektirir. Navigasyon için bir veri türü (String, Int, enum Route) tanımlar ve .navigationDestination aracılığıyla hedefi kaydedersiniz. NavigationLink yalnızca değeri yığına koyar ve SwiftUI basıldığında hedef View'i oluşturur.

swift
struct CatalogView: View {
    let categories: [String]

    var body: some View {
        List(categories, id: \.self) { category in
            NavigationLink(value: category) {
                Text(category)
            }
        }
        .navigationDestination(for: String.self) { category in
            CategoryView(name: category)
        }
    }
}

// Programmatic navigation:
struct DeepLinkView: View {
    @State private var path: [AppRoute] = []

    var body: some View {
        NavigationStack(path: $path) {
            HomeView()
                .navigationDestination(for: AppRoute.self) { route in
                    switch route {
                    case .detail(let id): DetailView(id: id)
                    case .settings: SettingsView()
                    }
                }
                .toolbar {
                    Button("Open Settings") {
                        path.append(AppRoute.settings)
                    }
                }
        }
    }
}

Programlı navigasyon: yola bir değer eklemek (path.append aracılığıyla), aynı değere sahip bir NavigationLink'e basmakla eşdeğerdir. Bu, ViewModel, Coordinator veya push bildirimlerine yanıt olarak navigasyon uygulamaya olanak tanır.

IsActive biçimi (NavigationLink(isActive:destination:label:)) uyumluluk için mevcuttur ancak iOS 16+'da önerilmez. Bir yol dizisi veya NavigationPath'e Binding ile value biçimini kullanın.

List'te NavigationLink, satırın sağ tarafında otomatik olarak bir açıklama göstergesi (chevron) görüntüler ve kullanıcıya basmanın başka bir ekrana götüreceğini belirtir. List, ok görüntülemeyi otomatik olarak yönetir — bir listenin dışındaki normal bir NavigationLink'in aksine, ok bulunmaz.

iOS 16 ile NavigationLink içeren List, List(data:rowContent:) içinde otomatik olarak value biçimini kullanır. List içinde ForEach kullanıldığında, açıklama göstergesi de otomatik olarak eklenir. Bu davranış değiştiriciler aracılığıyla devre dışı bırakılamaz — oku kaldırmanın tek yolu NavigationLink'i Button ile değiştirmektir.

List'te destination biçimi sorunu: List içinde NavigationLink(destination:label:) kullanırsanız, kullanıcı bağlantıya tıklamış olsun ya da olmasın, tüm hedef View'ler liste yüklenirken hemen oluşturulur. Çok sayıda satırı olan listeler için bu, ilk yüklemeyi önemli ölçüde yavaşlatabilir ve bellek tüketimini artırabilir. NavigationStack ile value biçimi bu sorunu çözer.

WWDC 2022 (Session 10054)'e göre Apple, yeni projeler için NavigationStack ve NavigationLink'in value biçimini kullanmayı önerir. Bu, satır sayısının fazla olabileceği dinamik verilere sahip List için özellikle önemlidir.

Desen 1: Özel NavigationLink görünümü. NavigationLink, herhangi bir View'i etiket olarak kabul eder ve bağlantı için özel tasarımlar oluşturmaya olanak tanır. List içinde bu özellikle kullanışlıdır — NavigationLink kullanırken otomatik açıklama göstergesi alırsınız.

swift
NavigationLink(value: ProductRoute.detail(product)) {
    HStack {
        AsyncImage(url: product.imageURL)
            .frame(width: 60, height: 60)
        VStack(alignment: .leading) {
            Text(product.name).font(.headline)
            Text(product.price) .foregroundColor(.secondary)
        }
    }
    .padding(8)
}

Desen 2: Oksuz NavigationLink (özel düğme). Açıklama göstergesine ihtiyacınız yoksa, programlı navigasyon için Button kullanın: path.append(value). Bu, NavigationLink'in doğal görünmediği özel arayüz öğeleri için kullanışlıdır.

Desen 3: Koşullu navigasyon. Boş bir destination kullanarak veya belirli değerler için .navigationDestination eklemeyerek NavigationLink'i engelleyebilirsiniz. Yol aracılığıyla programlı navigasyon, bir değer eklemeden önce koşulları kontrol etmeye olanak tanır.

Hacking with Swift (2024)'e göre NavigationLink ile ilgili sorunların çoğu, eski projelerde destination biçiminin kullanımıyla ilgilidir. NavigationStack'e geçiş yaparken, tüm NavigationLink(destination:label:) ifadelerini NavigationLink(value:label:) ile değiştirin ve kök düzeyinde .navigationDestination ekleyin.

Sıkça Sorulan Sorular

SwiftUI'de NavigationLink nedir?

NavigationLink, SwiftUI'de başka bir ekrana geçiş için bir View'dir. Basıldığında, hedef ekranı NavigationStack veya NavigationView navigasyon yığına yerleştirir. İki biçimi destekler: destination (hedef View) ve value (yönlendirme değeri) ile.

Hangi NavigationLink biçimi daha iyidir: destination mı value mu?

Value biçimi (iOS 16+) tercih edilir: hedef View yalnızca basıldığında oluşturulur, bağlantı işlenirken değil. Destination biçimi View'i hemen oluşturur ve bu da performans sorunlarına neden olabilir. iOS 16+ projeleri için value + NavigationDestination kullanın.

NavigationLink neden List'te ok oluşturur?

SwiftUI, List içindeki NavigationLink'e otomatik olarak bir açıklama göstergesi (ok) ekleyerek navigasyon olasılığını belirtir. Bu davranış devre dışı bırakılamaz. Oka ihtiyacınız yoksa, path.append() ile programlı navigasyon için Button kullanın.

NavigationLink ile programlı navigasyon nasıl yapılır?

Binding yolu olan NavigationStack kullanın ve path.append(value) aracılığıyla değerler ekleyin. Bu, aynı value'ya sahip bir NavigationLink'e basmakla eşdeğerdir. Programlı navigasyon, derin bağlantılar, push bildirimleri ve Coordinator desenini uygulamaya olanak tanır.

NavigationLink performansı etkiler mi?

Hedef View'ler başlatıcılarında ağır işlemler gerçekleştiriyorsa destination biçimi performansı etkileyebilir — tüm hedefler liste işlenirken oluşturulur. NavigationStack ile value biçimi, yalnızca basıldığında View'ler oluşturarak bu sorunu çözer. 50+ satırlı listeler için fark önemlidir.

Özet

  • NavigationLink — SwiftUI ekranları arasında navigasyon geçişleri için düğme
  • Value biçimi iOS 16+'da NavigationStack ile önerilir
  • Destination biçimi View'i erken oluşturur — büyük listeler için kaçının
  • Açıklama göstergesi — List'te otomatik ok (devre dışı bırakılamaz)
  • Programlı navigasyon path.append() ile derin bağlantılar ve Coordinator için
  • NavigationDestination hedef ekranları veri türlerine göre kaydeder
  • IsActive biçimi — kullanımdan kaldırıldı, iOS 16+'da value biçimini kullanın

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