NavigationStack SwiftUI-də müasir naviqasiya konteyneridir, iOS 16+ təqdim edilmiş və NavigationView-i əvəz etmişdir. Apple Developer Documentation, 2024-a görə, NavigationStack ekranların yığınını tip təhlükəsiz naviqasiya yolu (NavigationPath) vasitəsilə idarə edir, dərin naviqasiyanı, proqram vasitəsilə kök ekrana qayıtmağı və məlumat dəyişikliyində vəziyyətin saxlanmasını dəstəkləyir. NavigationView-dən fərqli olaraq, NavigationStack əlavə konteynerə bükmə tələb etmir və naviqasiya yoluna birbaşa Binding təmin edir.
Əasası
NavigationStack yığın (LIFO) əsasında naviqasiyanı həyata keçirən konteyner View-dir. O, keçid tarixçəsini idarə edir, yeni ekranları yığına yerləşdirməyə və sistem «Geri» düyməsi və ya proqram vasitəsilə geri qayıtmağa imkan verir. NavigationStack iOS 16, iPadOS 16, macOS 13, watchOS 9 və tvOS 16-dan SwiftUI-in bir hissəsidir.
NavigationStack-ın əsas yeniliyi tip təhlükəsiz naviqasiya yoludur. NavigationLink yaradarkən birbaşa destination göstərmək əvəzinə, yola dəyər (value) yerləşdirirsiniz və hədəf View-in qeydiyyatı ayrıca .navigationDestination(for:destination:) modifikatoru vasitəsilə aparılır. Bu, naviqasiyanı və göstərimi ayıraraq kodu daha modul və test ediləbilən edir.
WWDC 2022 (Session 10054)-yə görə, NavigationStack ObservableObject və SwiftUI həyat dövranına əsaslanan yeni naviqasiya mexanizmindən istifadə edir. Arxa planda UINavigationController-ə güvənən NavigationView-dən fərqli olaraq, NavigationStack tamamilə SwiftUI-də həyata keçirilmişdir ki, bu da proqnozlaşdırılma qabiliyyətini və SwiftUI həyat dövranı ilə uyğunluğu yaxşılaşdırır.
NavigationStack kök View və isteğə bağlı naviqasiya yolunu (NavigationPath və ya Hashable dəyərlər massivinə Binding) qəbul edir. Bütün alt ekranlar NavigationLink və ya dəyərlərin proqram vasitəsilə yola əlavə edilməsi ilə yığına yerləşdirilir.
NavigationView iOS 16-dək SwiftUI-in əsas naviqasiya konteyneri idi. Arxa planda UINavigationController-i avtomatik idarə edirdi ki, bu da bir sıra problemlərə səbəb olurdu: məlumat dəyişikliyində proqnozlaşdırılmayan davranış, proqram naviqasiyası ilə çətinliklər və tip təhlükəsizliyinin olmaması.
| Xüsusiyyət | NavigationStack (iOS 16+) | NavigationView (iOS 13–15) |
|---|---|---|
| Naviqasiya növü | Yığın (LIFO) | Yığın (LIFO) |
| Naviqasiya yolu | Tipli (NavigationPath) | Dəstəklənmir |
| Deep linking | Daxili dəstək | Hack tələb edir |
| Proqram qayıdışı | Yol vasitəsilə (pop, popToRoot) | dismiss, presentationMode |
| Arxa plan | SwiftUI native | UINavigationController |
| Uyğunluq | iOS 16+ | iOS 13+ |
Əasas üstünlük NavigationStack — tip təhlükəsiz naviqasiya. Yolu konkret tiplər massivi (və ya heterogen yığınlar üçün NavigationPath) kimi təyin edir və hər tip üçün destination qeydiyyatdan keçirirsiniz. Bu, tip uyğunsuzluğu səhvlərini aradan qaldırır və naviqasiyanı proqnozlaşdırılan edir.
NavigationView iOS 17-də köhnəlmişdir. Apple bütün yeni layihələr və minimal versiyanı iOS 16-ya yeniləyərkən NavigationStack-ə keçməyi tövsiyə edir.
NavigationPath NavigationStack-də naviqasiya yolunu təmsil edən tipdir. Heterogen dəyərləri (AnyHashable) saxlaya və ya [T: Hashable] massivinə Binding vasitəsilə konkret tiplə istifadə edilə bilər. NavigationPath vəziyyəti saxlamaq üçün avtomatik kodlaşdırılır və dekodlaşdırılır.
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")
}
}
Heterogen yığın: NavigationPath Hashable-i tətbiq edərsə, müxtəlif tipli dəyərləri ehtiva edə bilər. Məsələn, birinci ekran String (ID), ikinci — Int (nömrə), üçüncü — xüsusi enum Route qəbul edə bilər. Hər tipin göstərilməsi üçün ayrıca .navigationDestination qeydiyyatdan keçirilir.
Codable dəstəyi: NavigationPath Codable-i tətbiq edir, əgər yoldakı bütün dəyərlər də Codable + Hashable olarsa. Bu, tətbiq yenidışə salındıqda və ya fon rejiminə keçdikdə naviqasiya vəziyyətini saxlamağa və bərpa etməyə imkan verir.
.navigationDestination(for:destination:) — konkret məlumat tipi üçün hədəf View-i qeydiyyatdan keçirən modifikator. NavigationLink bu tipin dəyərini yola yerləşdirəndə, SwiftUI avtomatik olaraq müvafiq .navigationDestination-i tapır və ekranı yaradır.
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"))
Əhəmiyyətli qayda: .navigationDestination NavigationStack daxilində olan View-ə tətbiq edilməli və NavigationLink dəyəri yola yerləşdirməzdən əvvəl olmalıdır. Adətən kök View-ə və ya bölmə konteynerinə əlavə edilir. Əgər dəyər tipi üçün .navigationDestination tapılmazsa, keçid baş vermir.
SwiftUI Engineering (2023)-yə görə, .navigationDestination iyerarxiyanın müxtəlif səviyyələrində qeydiyyatdan keçirilə bilər. SwiftUI naviqasiya cəhdi zamanın ən yaxın uyğun destination-i axtarır. Bu, tətbiqin müxtəlif hissələrində bir tip üçün destination-i ləğv etməyə imkan verir.
Nümunə 1: enum Route vasitəsilə naviqasiya. Tətbiqin bütün ekranları üçün əlaqəli dəyərləri olan enum təyin edin. AppRoute üçün bir .navigationDestination və marşruizasiya üçün switch istifadə edin. Bu, tətbiqdəki bütün mümkün keçidlər üçün vahid həqiqət mənbəyi təmin edir.
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)
}
Nümunə 2: proqram naviqasiyası və deep linking. NavigationStack yığını proqram vasitəsilə idarə etməyə imkan verir: ekranları əlavə etmək, silmək və kökə qayıtmaq. Bu, push bildirişləri, dərin linklər və yenidən başlatmadan sonra naviqasiyanın bərpası üçün zəruridir.
Nümunə 3: NavigationPath əvəzinə tiplər massivi. Əgər bütün ekranlar bir tipdəndirsə (məsələn, String və ya xüsusi enum), [T]-yə Binding istifadə edin. Bu, NavigationPath-dən daha ciddi tipizasiya və daha yaxşı performans verir. NavigationPath müxtəlif ekran tipləri olan heterogen yığınlar üçün əsaslandırılmışdır.
Point-Free (2024)-yə görə, enum Route ilə NavigationStack SwiftUI tətbiqlərində naviqasiyanın təşkilinin üstünlüklü üsuludur. Bütün mümkün keçidləri açıq, tip təhlükəsiz və test ediləbilən edir ki, bu da xüsusilə onlarla ekranı olan böyük layihələr üçün vacibdir.
Tez-tez verilən suallar
NavigationStack — tip təhlükəsiz yol vasitəsilə ekran yığınını idarə edən SwiftUI (iOS 16+) naviqasiya konteyneri. NavigationView-i əvəz etmiş, deep linking, proqram naviqasiyası və vəziyyətin saxlanmasını təklif edir.
NavigationStack NavigationLink-i birbaşa destination ilə əlaqələndirmək əvəzinə tip təhlükəsiz yol (NavigationPath) istifadə edir. Proqram naviqasiyasını, deep linking-i və vəziyyətin saxlanması üçün Codable-i dəstəkləyir. UINavigationController əvəzinə birbaşa SwiftUI-də işləyir.
NavigationPath yığındakı ekranların ardıcıllığını təmsil edən tipdir. Dəyərləri path.append() və ya NavigationLink vasitəsilə value ilə əlavə edirsiniz. Hər tipin göstərilməsi üçün .navigationDestination qeydiyyatdan keçirilir. NavigationPath Codable və avtomatik vəziyyət saxlamaçlı dəstəkləyir.
Yolun proqram idarəsi vasitəsilə: URL emal edildikdən sonra müvafiq marşruza dəyəri ilə path.append() çağırın. NavigationStack avtomatik olaraq hədəf ekranı göstərir. Kökə qayıtmaq üçün path.removeLast(path.count).
Bəli, minimum versiyanız iOS 16+ olarsa. NavigationView iOS 17-də köhnəlmişdir. Keçid tip təhlükəsiz naviqasiya, deep linking dəstəyi və SwiftUI həyat dövranı ilə daha yaxşı uyğunluq verir. iOS 15 və aşağı olan layihələr üçün hələlik NavigationView istifadə edin.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun