NavigationStack: nədir, SwiftUI-də naviqasiya yığını

Müəllif: IT Sectr Dərc olunub: 2026-06-24 Oxuma vaxtı: 6 dəq

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 — yeni SwiftUI naviqasiya konteyneri (iOS 16+)
  • NavigationPath — ekran yığınını idarə etmək üçün tip təhlükəsiz yol
  • Deep linking — yol vasitəsilə proqram naviqasiyasının dəstəyi
  • NavigationDestination — məlumat növlərinə görə hədəf ekranların qeydiyyatı
  • Vəziyyət avtomatik saxlanılır və bərpa edilir

SwiftUI-də NavigationStack nədir?

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-ın əsas strukturu

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ətNavigationStack (iOS 16+)NavigationView (iOS 13–15)
Naviqasiya növüYığın (LIFO)Yığın (LIFO)
Naviqasiya yoluTipli (NavigationPath)Dəstəklənmir
Deep linkingDaxili dəstəkHack tələb edir
Proqram qayıdışıYol vasitəsilə (pop, popToRoot)dismiss, presentationMode
Arxa planSwiftUI nativeUINavigationController
UyğunluqiOS 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.

swift
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.

swift
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.

swift
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

SwiftUI-də NavigationStack nədir?

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 NavigationView-dən nə ilə fərqlənir?

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 necə 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.

NavigationStack ilə deep linking necə həyata keçirilir?

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).

NavigationView-dən NavigationStack-ə keçmək lazımdır?

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ə

  • NavigationStack — müasir SwiftUI naviqasiya konteyneri (iOS 16+)
  • NavigationPath — ekran yığınını idarə etmək üçün tip təhlükəsiz yol
  • NavigationDestination — məlumat növlərinə görə hədəf View-lərin qeydiyyatı
  • NavigationView iOS 17-də köhnəlmişdir, keçid tövsiyə olunur
  • Deep linking və proqram naviqasiyası — daxili dəstək
  • Enum Route — naviqasiyanın təşkili üçün üstünlüklü nümunə
  • Heterogen yığın NavigationPath vasitəsilə istənilən Hashable tiplərlə

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.

Layihəni müzakirə et

Həm də oxuyun