NavigationStack: bu nima, SwiftUI-da navigatsion stek

Muallif: IT Sectr Nashr etilgan: 2026-06-24 O'qish vaqti: 6 daq

NavigationStack SwiftUI-da zamonaviy navigatsiya konteyneri bo‘lib, iOS 16+ da taqdim etilgan va NavigationView o‘rnini egallagan. Apple Developer Documentation, 2024 ma’lumotlariga ko‘ra, NavigationStack ekranlar stekini tip xavfsiz navigatsiya yo‘li (NavigationPath) orqali boshqaradi, chuqur navigatsiyani, dasturiy ravishda asosiy ekranga qaytishni va ma’lumot o‘zgarishida holatni saqlashni qo‘llab-quvvatlaydi. NavigationView-dan farqli o‘laroq, NavigationStack qo‘shimcha konteynerga o‘rashni talab qilmaydi va navigatsiya yo‘liga to‘g‘ridan-to‘g‘ri Binding taqdim etadi.

Asosiysi

  • NavigationStack — yangi SwiftUI navigatsiya konteyneri (iOS 16+)
  • NavigationPath — ekranlar stekini boshqarish uchun tip xavfsiz yo‘l
  • Deep linking — yo‘l orqali dasturiy navigatsiyani qo‘llab-quvvatlash
  • NavigationDestination — ma’lumot turlariga ko‘ra maqsadli ekranlarni ro‘yxatdan o‘tkazish
  • Holat navigatsiya avtomatik saqlanadi va tiklanadi

SwiftUI-da NavigationStack nima?

NavigationStack stek (LIFO) asosida navigatsiyani amalga oshiradigan konteyner View hisoblanadi. U o‘tishlar tarixini boshqaradi, yangi ekranlarni stekka joylashtirishga va tizimning «Orqaga» tugmasi yoki dasturiy ravishda qaytishga imkon beradi. NavigationStack iOS 16, iPadOS 16, macOS 13, watchOS 9 va tvOS 16 dan boshlab SwiftUI ning bir qismidir.

NavigationStack ning asosiy yangiligi — tip xavfsiz navigatsiya yo‘li. NavigationLink yaratishda destination ni to‘g‘ridan-to‘g‘ri ko‘rsatish o‘rniga, yo‘lga qiymat (value) joylashtirasiz va maqsadli View ni ro‘yxatdan o‘tkazish alohida .navigationDestination(for:destination:) modifikatori orqali amalga oshiriladi. Bu navigatsiya va ko‘rsatishni ajratib, kodni yanada modulli va sinab ko‘riladigan qiladi.

WWDC 2022 (Session 10054) ma’lumotlariga ko‘ra, NavigationStack ObservableObject va SwiftUI hayotiy siklida asoslangan yangi navigatsiya mexanizmidan foydalanadi. UINavigationController ga tayanadigan NavigationView dan farqli o‘laroq, NavigationStack to‘liq SwiftUI da amalga oshirilgan bo‘lib, bu bashorat qilish qobiliyatini va SwiftUI hayotiy sikl bilan muvofiqligini yaxshilaydi.

NavigationStack ning asosiy tuzilishi

NavigationStack ildiz View va ixtiyoriy navigatsiya yo‘lini (NavigationPath yoki Hashable qiymatlar massiviga Binding) qabul qiladi. Barcha biriktirilgan ekranlar NavigationLink yoki qiymatlarni dasturiy ravishda yo‘lga qo‘shish orqali stekka joylashtiriladi.

NavigationView iOS 16 gacha SwiftUI ning asosiy navigatsiya konteyneri edi. U avtomatik ravishda UINavigationController ni orqa fonda boshqarar edi, bu bir qator muammolarga olib keldi: ma’lumot o‘zgarishida oldindan aytib bo‘lmaydigan xatti-harakat, dasturiy navigatsiya bilan qiyinchiliklar va tip xavfsizligining yo‘qligi.

XususiyatNavigationStack (iOS 16+)NavigationView (iOS 13–15)
Navigatsiya turiStek (LIFO)Stek (LIFO)
Navigatsiya yo‘liTipli (NavigationPath)Qo‘llab-quvvatlanmaydi
Deep linkingO‘rnatilgan qo‘llab-quvvatlashHacklarni talab qiladi
Dasturiy qaytishYo‘l orqali (pop, popToRoot)dismiss, presentationMode
Orqa fondaSwiftUI nativeUINavigationController
MuvofiqligiiOS 16+iOS 13+

Asosiy afzallik NavigationStack — tip xavfsiz navigatsiya. Siz yo‘lni aniq turlar massivi (yoki geterogen steklar uchun NavigationPath) sifatida belgilaysiz va har bir tur uchun destination ni ro‘yxatdan o‘tkazasiz. Bu tur nomuvofiqligi xatolarini bartaraf qiladi va navigatsiyani oldindan aytish mumkin qiladi.

NavigationView iOS 17 da eskirgan. Apple barcha yangi loyihalar va minimal versiyani iOS 16 ga yangilashda NavigationStack ga o‘tishni tavsiya qiladi.

NavigationPath NavigationStack dagi navigatsiya yo‘lini ifodalovchi turdir. U geterogen qiymatlarni (AnyHashable) saqlashi yoki [T: Hashable] massiviga Binding orqali aniq tur bilan ishlatilishi mumkin. NavigationPath holatni saqlash uchun avtomatik ravishda kodlanadi va dekodlanadi.

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")
    }
}

Geterogen stek: NavigationPath Hashable ni amalga oshirsa, turli xil turdagi qiymatlarni o‘z ichiga olishi mumkin. Masalan, birinchi ekran String (ID), ikkinchisi — Int (raqam), uchinchisi — maxsus enum Route ni qabul qilishi mumkin. Har bir turni ko‘rsatish uchun alohida .navigationDestination ro‘yxatdan o‘tkaziladi.

Codable qo‘llab-quvvatlashi: NavigationPath Codable ni amalga oshiradi, agar yo‘ldagi barcha qiymatlar ham Codable + Hashable bo‘lsa. Bu ilova qayta ishga tushirilganda yoki fon rejimiga o‘tganda navigatsiya holatini saqlash va tiklash imkonini beradi.

.navigationDestination(for:destination:) — ma’lum bir ma’lumot turi uchun maqsadli View ni ro‘yxatdan o‘tkazuvchi modifikator. NavigationLink bu turning qiymatini yo‘lga joylashtirganda, SwiftUI avtomatik ravishda tegishli .navigationDestination ni topadi va ekran yaratadi.

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

Muhim qoida: .navigationDestination NavigationStack ichida joylashgan View ga qo‘llanilishi kerak va NavigationLink qiymatni yo‘lga joylashtirishdan oldin bo‘lishi kerak. Odatda u ildiz View ga yoki bo‘lim konteyneriga qo‘shiladi. Agar qiymat turi uchun .navigationDestination topilmasa, o‘tish amalga oshmaydi.

SwiftUI Engineering (2023) ma’lumotlariga ko‘ra, .navigationDestination ierarxiyaning turli darajalarida ro‘yxatdan o‘tkazilishi mumkin. SwiftUI navigatsiya urinishida eng yaqin mos destination ni qidiradi. Bu ilovaning turli qismlarida bitta tur uchun destination ni bekor qilish imkonini beradi.

Naqsh 1: enum Route orqali navigatsiya. Ilovaning barcha ekranlari uchun bog‘langan qiymatlarga ega enum ni belgilang. AppRoute uchun bitta .navigationDestination va marshrutlash uchun switch dan foydalaning. Bu ilovadagi barcha mumkin bo‘lgan o‘tishlar uchun yagona haqiqat manbasini ta’minlaydi.

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

Naqsh 2: dasturiy navigatsiya va deep linking. NavigationStack stekni dasturiy ravishda boshqarish imkonini beradi: ekranlarni qo‘shish, olib tashlash va ildizga qaytish. Bu push bildirishnomalari, chuqur havolalar va qayta ishga tushirishdan keyin navigatsiyani tiklash uchun zarurdir.

Naqsh 3: NavigationPath o‘rniga turlar massivi. Agar barcha ekranlar bitta turdan foydalansa (masalan, String yoki maxsus enum), [T] ga Binding dan foydalaning. Bu NavigationPath ga qaraganda qattiqroq tipizatsiya va yaxshiroq ishlashni ta’minlaydi. NavigationPath turli xil ekran turlariga ega geterogen steklar uchun asoslangan.

Point-Free (2024) ma’lumotlariga ko‘ra, enum Route bilan NavigationStack SwiftUI ilovalarida navigatsiyani tashkil qilishning afzal usulidir. Barcha mumkin bo‘lgan o‘tishlarni aniq, tip xavfsiz va sinab ko‘riladigan qiladi, bu ayniqsa o‘nlab ekranlari bo‘lgan katta loyihalar uchun muhimdir.

Tez-tez so‘raladigan savollar

SwiftUI-da NavigationStack nima?

NavigationStack — tip xavfsiz yo‘l orqali ekranlar stekini boshqaruvchi SwiftUI (iOS 16+) navigatsiya konteyneri. NavigationView o‘rnini egallagan bo‘lib, deep linking, dasturiy navigatsiya va holatni saqlashni taklif qiladi.

NavigationStack NavigationView dan qanday farq qiladi?

NavigationStack NavigationLink ni destination bilan to‘g‘ridan-to‘g‘ri bog‘lash o‘rniga tip xavfsiz yo‘l (NavigationPath) dan foydalanadi. Dasturiy navigatsiyani, deep linking va holatni saqlash uchun Codable ni qo‘llab-quvvatlaydi. UINavigationController o‘rniga to‘g‘ridan-to‘g‘ri SwiftUI da ishlaydi.

NavigationPath qanday ishlaydi?

NavigationPath stekdagi ekranlar ketma-ketligini ifodalovchi turdir. Siz qiymatlarni path.append() yoki NavigationLink orqali value bilan yo‘lga qo‘shasiz. Har bir turni ko‘rsatish uchun .navigationDestination ro‘yxatdan o‘tkaziladi. NavigationPath Codable va avtomatik holatni saqlashni qo‘llab-quvvatlaydi.

NavigationStack bilan deep linkingni qanday amalga oshirish kerak?

Yo‘lni dasturiy boshqarish orqali: URL ni qayta ishlagandan so‘ng, tegishli marshrut qiymati bilan path.append() ni chaqiring. NavigationStack avtomatik ravishda maqsadli ekranni ko‘rsatadi. Ildizga qaytish — path.removeLast(path.count).

NavigationView dan NavigationStack ga o‘tish kerakmi?

Ha, agar minimal versiyangiz iOS 16+ bo‘lsa. NavigationView iOS 17 da eskirgan. O‘tish tip xavfsiz navigatsiya, deep linking qo‘llab-quvvatlashi va SwiftUI hayotiy sikli bilan yaxshiroq muvofiqlikni beradi. iOS 15 va undan past bo‘lgan loyihalar uchun hali ham NavigationView dan foydalaning.

Xulosa

  • NavigationStack — zamonaviy SwiftUI navigatsiya konteyneri (iOS 16+)
  • NavigationPath — ekranlar stekini boshqarish uchun tip xavfsiz yo‘l
  • NavigationDestination — ma’lumot turlariga ko‘ra maqsadli View larni ro‘yxatdan o‘tkazish
  • NavigationView iOS 17 da eskirgan, o‘tish tavsiya etiladi
  • Deep linking va dasturiy navigatsiya — o‘rnatilgan qo‘llab-quvvatlash
  • Enum Route — navigatsiyani tashkil qilishning afzal naqshi
  • Geterogen stek NavigationPath orqali har qanday Hashable turlar bilan

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing