NavigationStack, iOS 16+'da tanıtılan ve NavigationView'ın yerini alan SwiftUI'daki modern bir navigasyon kapsayıcısıdır. Apple Developer Documentation, 2024'e göre, NavigationStack tür güvenli bir navigasyon yolu (NavigationPath) aracılığıyla bir ekran yığınını yönetir, derin navigasyonu, programlı olarak kök ekrana dönüşü ve veri değiştiğinde durum korumayı destekler. NavigationView'ın aksine, NavigationStack ek bir kapsayıcıya sarmalanmayı gerektirmez ve navigasyon yoluna doğrudan Binding sağlar.
Önemli Noktalar
NavigationStack, yığın tabanlı navigasyonu (LIFO) uygulayan bir kapsayıcı View'dır. Geçiş geçmişini yönetir, yeni ekranları yığına itmenize ve sistem “Geri” düğmesi veya programlı olarak geri dönmenize olanak tanır. NavigationStack, iOS 16, iPadOS 16, macOS 13, watchOS 9 ve tvOS 16'dan itibaren SwiftUI'nin bir parçasıdır.
NavigationStack'in ana yeniliği tür güvenli navigasyon yoludur. Bir NavigationLink oluştururken doğrudan bir hedef belirtmek yerine, yola bir değer koyarsınız ve hedef View, .navigationDestination(for:destination:) değiştiricisi aracılığıyla ayrı olarak kaydedilir. Bu, navigasyonu oluşturmadan ayırarak kodu daha modüler ve test edilebilir hale getirir.
WWDC 2022 (Oturum 10054)'e göre NavigationStack, ObservableObject ve SwiftUI yaşam döngüsüne dayalı yeni bir navigasyon mekanizması kullanır. İçeride UINavigationController'a dayanan NavigationView'ın aksine NavigationStack tamamen SwiftUI'da uygulanmıştır, bu da SwiftUI yaşam döngüsüyle öngörülebilirliği ve uyumluluğu artırır.
NavigationStack, bir kök View ve isteğe bağlı bir navigasyon yolu (NavigationPath veya Hashable değerler dizisine Binding) kabul eder. Tüm alt ekranlar, NavigationLink aracılığıyla veya yola programlı olarak değerler eklenerek yığına itilir.
NavigationView, iOS 16'dan önce SwiftUI'daki ana navigasyon kapsayıcısıydı. İçeride otomatik olarak UINavigationController'ı yönetiyordu, bu da birkaç soruna yol açıyordu: veri değiştiğinde öngörülemeyen davranış, programlı navigasyonda karmaşıklık ve tür güvenliği eksikliği.
| Özellik | NavigationStack (iOS 16+) | NavigationView (iOS 13–15) |
|---|---|---|
| Navigasyon türü | Yığın (LIFO) | Yığın (LIFO) |
| Navigasyon yolu | Türlenmiş (NavigationPath) | Desteklenmiyor |
| Deep linking | Yerleşik destek | Geçici çözüm gerekli |
| Programlı dönüş | Yol ile (pop, popToRoot) | dismiss, presentationMode |
| İç yapı | SwiftUI yerel | UINavigationController |
| Uyumluluk | iOS 16+ | iOS 13+ |
Ana avantajı NavigationStack'in — tür güvenli navigasyon. Yolu belirli türlerde bir dizi (veya heterojen yığınlar için NavigationPath) olarak tanımlar ve her tür için bir hedef kaydedersiniz. Bu, tür uyumsuzluğu hatalarını ortadan kaldırır ve navigasyonu öngörülebilir hale getirir.
NavigationView, iOS 17'de kullanımdan kaldırılmıştır. Apple, tüm yeni projeler için ve minimum sürüm iOS 16'ya güncellenirken NavigationStack'e geçiş yapılmasını önerir.
NavigationPath, NavigationStack'teki navigasyon yolunu temsil eden bir türdür. Heterojen değerleri (AnyHashable) depolayabilir veya bir dizi [T: Hashable]'a Binding aracılığıyla belirli bir türle kullanılabilir. NavigationPath, durum koruması için otomatik olarak kodlanır ve kod çözer.
struct ContentView: View {
@State private var path = NavigationPath()
var body: some View {
NavigationStack(path: $path) {
HomeView()
.navigationDestination(for: String.self) { value in
DetailView(id: value)
}
.navigationDestination(for: Int.self) { value in
NumberView(number: value)
}
}
}
func goToRoot() {
path.removeLast(path.count)
}
func pushDeepLink() {
path.append("detail_42")
}
}
Heterojen yığın: NavigationPath, Hashable uyguluyorlarsa farklı türlerde değerler içerebilir. Örneğin, ilk ekran bir String (ID), ikincisi bir Int (sayı), üçüncüsü özel bir enum Route kabul edebilir. Her tür, görüntüleme için ayrı bir .navigationDestination kaydeder.
Codable desteği: NavigationPath, yoldaki tüm değerler de Codable + Hashable ise Codable uygular. Bu, uygulama yeniden başlatıldığında veya arka plana geçildiğinde navigasyon durumunu kaydetmeye ve geri yüklemeye olanak tanır.
.navigationDestination(for:destination:) — belirli bir veri türü için bir hedef View kaydeden bir değiştiricidir. NavigationLink bu türden bir değeri yola koyduğunda, SwiftUI otomatik olarak ilgili .navigationDestination'i bulur ve ekranı oluşturur.
enum AppRoute: Hashable {
case profile(UserID)
case settings
case about
}
struct AppNavigation: View {
@State private var path = NavigationPath()
var body: some View {
NavigationStack(path: $path) {
HomeView()
.navigationDestination(for: AppRoute.self) { route in
switch route {
case .profile(let id):
ProfileView(userId: id)
case .settings:
SettingsView()
case .about:
AboutView()
}
}
}
}
}
// Navigate: path.append(AppRoute.profile("user_123"))
Önemli kural: .navigationDestination, NavigationStack içinde bulunan bir View'a ve NavigationLink yola bir değer koymadan önce uygulanmalıdır. Genellikle kök View'a veya bir bölüm kapsayıcısına eklenir. Değerin türü için .navigationDestination bulunamazsa, geçiş gerçekleşmez.
SwiftUI Engineering (2023)'e göre, .navigationDestination hiyerarşinin farklı seviyelerinde kaydedilebilir. SwiftUI navigasyon sırasında en yakın eşleşen hedefi arar. Bu, uygulamanın farklı bölümlerinde bir tür için hedefin geçersiz kılınmasına olanak tanır.
Desen 1: enum Route ile navigasyon. Uygulamadaki tüm ekranlar için ilişkili değerlerle bir enum tanımlayın. Yönlendirme için AppRoute için bir .navigationDestination ve bir switch kullanın. Bu, uygulamadaki tüm olası geçişler için tek bir doğruluk kaynağı sağlar.
struct StoreView: View {
@State private var path: [ProductRoute] = []
var body: some View {
NavigationStack(path: $path) {
ProductGrid()
.navigationDestination(for: ProductRoute.self) { route in
switch route {
case .detail(let product):
ProductDetail(product: product)
case .reviews(let productId):
ReviewsView(productId: productId)
}
}
}
}
}
enum ProductRoute: Hashable {
case detail(Product)
case reviews(String)
}
Desen 2: programlı navigasyon ve deep linking. NavigationStack, programlı yığın yönetimine olanak tanır: ekran ekleme, kaldırma ve köke dönme. Bu, push bildirimleri, deep link'ler ve yeniden başlatma sonrası navigasyonu geri yükleme için gereklidir.
Desen 3: NavigationPath yerine tür dizisi. Tüm ekranlar aynı türü kullanıyorsa (örneğin, String veya özel bir enum), [T]'ye Binding kullanın. Bu, NavigationPath'ten daha güçlü tipleme ve daha iyi performans sağlar. NavigationPath, farklı ekran türlerine sahip heterojen yığınlar için uygundur.
Point-Free (2024)'e göre, enum Route ile NavigationStack, SwiftUI uygulamalarında navigasyonu düzenlemenin tercih edilen yoludur. Tüm olası geçişleri açık, tür güvenli ve test edilebilir hale getirir; bu, onlarca ekranı olan büyük projeler için özellikle önemlidir.
Sıkça Sorulan Sorular
NavigationStack — tür güvenli bir yol aracılığıyla bir ekran yığınını yöneten SwiftUI navigasyon kapsayıcısıdır (iOS 16+). NavigationView'ın yerini almış, deep linking, programlı navigasyon ve durum koruma desteği sunar.
NavigationStack, NavigationLink'i doğrudan bir hedefe bağlamak yerine tür güvenli bir yol (NavigationPath) kullanır. Programlı navigasyonu, deep linking'i ve durum koruması için Codable'ı destekler. UINavigationController üzerinden değil, SwiftUI üzerinde çalışır.
NavigationPath, yığındaki ekran sırasını temsil eden bir türdür. path.append() veya değerli NavigationLink aracılığıyla yola değerler eklersiniz. Her tür, görüntüleme için bir .navigationDestination kaydeder. NavigationPath, Codable ve otomatik durum korumasını destekler.
Programlı yol yönetimi yoluyla: URL işlendikten sonra, karşılık gelen rota değeriyle path.append() çağrısı yapın. NavigationStack otomatik olarak hedef ekranı görüntüler. Köke dönüş — path.removeLast(path.count).
Evet, minimum sürümünüz iOS 16+ ise. NavigationView, iOS 17'de kullanımdan kaldırılmıştır. Geçiş, tür güvenli navigasyon, deep linking desteği ve SwiftUI yaşam döngüsüyle daha iyi uyum sağlar. iOS 15 ve altını hedefleyen projeler için şimdilik NavigationView'ı kullanmaya devam edin.
Özet
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.
Ayrıca okuyun