NavigationStack: ano ito, navigation stack sa SwiftUI

May-akda: IT Sectr Nai-publish: 2026-06-24 Oras ng pagbabasa: 6 min

NavigationStack ay isang modernong navigation container sa SwiftUI, ipinakilala sa iOS 16+ at pumalit sa NavigationView. Ayon sa Apple Developer Documentation, 2024, NavigationStack namamahala ng stack ng mga screen sa pamamagitan ng isang type-safe na navigation path (NavigationPath), sumusuporta sa malalim na navigation, programmatic na pagbabalik sa root screen at pagpapanatili ng estado kapag nagbago ang data. Hindi tulad ng NavigationView, ang NavigationStack ay hindi nangangailangan ng pagbalot sa karagdagang container at nagbibigay ng direktang Binding sa navigation path.

Pangunahin

  • NavigationStack — bagong SwiftUI navigation container (iOS 16+)
  • NavigationPath — type-safe na path para sa pamamahala ng stack ng mga screen
  • Deep linking — suporta para sa programmatic navigation sa pamamagitan ng path
  • NavigationDestination — pagrerehistro ng target na mga screen ayon sa mga uri ng data
  • Estado ng navigation ay awtomatikong nai-save at na-restore

Ano ang NavigationStack sa SwiftUI?

NavigationStack ay isang container View na nagpapatupad ng navigation batay sa stack (LIFO). Pinamamahalaan nito ang kasaysayan ng mga transition, na nagpapahintulot sa iyo na maglagay ng mga bagong screen sa stack at bumalik sa pamamagitan ng system button «Bumalik» o programmatically. Ang NavigationStack ay bahagi ng SwiftUI simula sa iOS 16, iPadOS 16, macOS 13, watchOS 9 at tvOS 16.

Ang pangunahing inobasyon ng NavigationStack ay ang type-safe na navigation path. Sa halip na direktang ituro ang destination kapag gumagawa ng NavigationLink, naglalagay ka ng value sa path, at ang pagrerehistro ng target na View ay hiwalay na ginagawa sa pamamagitan ng modifier na .navigationDestination(for:destination:). Pinaghihiwalay nito ang navigation at display, ginagawang mas modular at testable ang code.

Ayon sa WWDC 2022 (Session 10054), gumagamit ang NavigationStack ng bagong mekanismo ng navigation batay sa ObservableObject at SwiftUI lifecycle. Hindi tulad ng NavigationView na umaasa sa UINavigationController sa ilalim ng hood, ang NavigationStack ay ganap na ipinatupad sa SwiftUI, na nagpapabuti sa predictability at compatibility sa SwiftUI lifecycle.

Pangunahing istraktura ng NavigationStack

Tumatanggap ang NavigationStack ng root View at opsyonal na navigation path (Binding sa NavigationPath o array ng Hashable values). Lahat ng child screen ay inilalagay sa stack sa pamamagitan ng NavigationLink o programmatic na pagdaragdag ng mga value sa path.

NavigationView ay ang pangunahing navigation container ng SwiftUI hanggang iOS 16. Awtomatiko nitong pinamamahalaan ang UINavigationController sa ilalim ng hood, na nagdulot ng ilang problema: hindi inaasahang pag-uugali kapag nagbago ang data, kahirapan sa programmatic navigation, at kakulangan ng type safety.

KatangianNavigationStack (iOS 16+)NavigationView (iOS 13–15)
Uri ng navigationStack (LIFO)Stack (LIFO)
Navigation pathNaka-type (NavigationPath)Hindi sinusuportahan
Deep linkingBuilt-in na suportaNangangailangan ng hack
Programmatic na pagbabalikSa pamamagitan ng path (pop, popToRoot)dismiss, presentationMode
Sa ilalim ng hoodSwiftUI nativeUINavigationController
PagkatugmaiOS 16+iOS 13+

Pangunahing bentahe ng NavigationStack — type-safe navigation. Tinutukoy mo ang path bilang array ng mga konkretong uri (o NavigationPath para sa heterogenous stacks) at nagrerehistro ng destination para sa bawat uri. Tinatanggal nito ang mga error sa hindi pagtutugma ng uri at ginagawang predictable ang navigation.

Ang NavigationView ay deprecated sa iOS 17. Inirerekomenda ng Apple ang paglipat sa NavigationStack para sa lahat ng bagong proyekto at kapag nag-a-update ng minimum na bersyon sa iOS 16.

NavigationPath ay isang uri na kumakatawan sa navigation path sa NavigationStack. Maaari itong mag-imbak ng heterogenous values (AnyHashable) o gamitin sa isang konkretong uri sa pamamagitan ng Binding sa array [T: Hashable]. Ang NavigationPath ay awtomatikong nag-e-encode at nagde-decode para mapanatili ang estado.

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

Heterogenous stack: Maaaring maglaman ang NavigationPath ng mga value ng iba't ibang uri kung nagpapatupad sila ng Hashable. Halimbawa, ang unang screen ay maaaring tumanggap ng String (ID), pangalawa — Int (numero), pangatlo — custom na enum Route. Para sa pagpapakita ng bawat uri, isang hiwalay na .navigationDestination ang nirerehistro.

Suporta sa Codable: Ipinapatupad ng NavigationPath ang Codable kung ang lahat ng value sa path ay Codable + Hashable din. Pinapayagan nito ang pag-save at pag-restore ng estado ng navigation kapag nag-restart ng app o lumipat sa background.

.navigationDestination(for:destination:) — isang modifier na nagrerehistro ng target na View para sa isang partikular na uri ng data. Kapag naglagay ang NavigationLink ng value ng uri na ito sa path, awtomatikong hahanapin ng SwiftUI ang kaukulang .navigationDestination at gagawa ng screen.

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

Mahalagang tuntunin: Ang .navigationDestination ay dapat ilapat sa View na nasa loob ng NavigationStack, at bago maglagay ang NavigationLink ng value sa path. Karaniwan itong idinadagdag sa root View o sa container ng section. Kung hindi mahanap ang .navigationDestination para sa uri ng value, hindi magaganap ang transition.

Ayon sa SwiftUI Engineering (2023), ang .navigationDestination ay maaaring irehistro sa iba't ibang antas ng hierarchy. Hinahanap ng SwiftUI ang pinakamalapit na angkop na destination kapag nagtatangkang mag-navigate. Pinapayagan nito ang pag-override ng destination para sa isang uri sa iba't ibang bahagi ng app.

Pattern 1: navigation sa pamamagitan ng enum Route. Tukuyin ang isang enum na may kaugnay na value para sa lahat ng screen ng app. Gumamit ng isang .navigationDestination para sa AppRoute at switch para sa routing. Nagbibigay ito ng iisang source of truth para sa lahat ng posibleng transition sa app.

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

Pattern 2: programmatic navigation at deep linking. Pinapayagan ng NavigationStack ang programmatic na pamamahala ng stack: pagdaragdag, pag-alis ng mga screen at pagbabalik sa root. Ito ay kinakailangan para sa push notification, deep link, at pag-restore ng navigation pagkatapos mag-restart.

Pattern 3: array ng mga uri sa halip na NavigationPath. Kung ang lahat ng screen ay gumagamit ng isang uri (hal. String o custom na enum), gumamit ng Binding sa [T]. Nagbibigay ito ng mas mahigpit na typification at mas mahusay na performance kaysa sa NavigationPath. Ang NavigationPath ay nabibigyang-katwiran para sa heterogenous stacks na may iba't ibang uri ng screen.

Ayon sa Point-Free (2024), ang NavigationStack na may enum Route ay ang ginustong paraan ng pag-oorganisa ng navigation sa mga SwiftUI app. Ginagawa nitong tahasan, type-safe at testable ang lahat ng posibleng transition, na lalong mahalaga para sa malalaking proyekto na may dose-dosenang screen.

Mga madalas itanong

Ano ang NavigationStack sa SwiftUI?

NavigationStack — isang SwiftUI navigation container (iOS 16+) na namamahala ng stack ng screen sa pamamagitan ng type-safe path. Pumalit ito sa NavigationView, nag-aalok ng suporta para sa deep linking, programmatic navigation at pag-save ng estado.

Paano naiiba ang NavigationStack sa NavigationView?

Gumagamit ang NavigationStack ng type-safe path (NavigationPath) sa halip na direktang pag-link ng NavigationLink sa destination. Sinusuportahan nito ang programmatic navigation, deep linking at Codable para sa pag-save ng estado. Gumagana ito sa SwiftUI, hindi sa pamamagitan ng UINavigationController.

Paano gumagana ang NavigationPath?

NavigationPath ay isang uri na kumakatawan sa pagkakasunod-sunod ng mga screen sa stack. Nagdaragdag ka ng mga value sa path sa pamamagitan ng path.append() o sa pamamagitan ng NavigationLink na may value. Para sa pagpapakita ng bawat uri, nirerehistro ang .navigationDestination. Sinusuportahan ng NavigationPath ang Codable at awtomatikong pag-save ng estado.

Paano ipatupad ang deep linking gamit ang NavigationStack?

Sa pamamagitan ng programmatic na pamamahala ng path: pagkatapos iproseso ang URL, tawagan ang path.append() na may kaukulang halaga ng ruta. Awtomatikong ipapakita ng NavigationStack ang target na screen. Pagbabalik sa root — path.removeLast(path.count).

Kailangan bang lumipat mula NavigationView patungo NavigationStack?

Oo, kung ang iyong minimum na bersyon ay iOS 16+. Ang NavigationView ay deprecated sa iOS 17. Ang paglipat ay nagbibigay ng type-safe navigation, suporta sa deep linking at mas mahusay na pagkakatugma sa SwiftUI lifecycle. Para sa mga proyektong may iOS 15 at mas mababa, gamitin pa rin ang NavigationView.

Buod

  • NavigationStack — modernong SwiftUI navigation container (iOS 16+)
  • NavigationPath — type-safe path para sa pamamahala ng stack ng screen
  • NavigationDestination — pagrerehistro ng target na Views ayon sa uri ng data
  • NavigationView deprecated sa iOS 17, inirerekomenda ang paglipat
  • Deep linking at programmatic navigation — built-in na suporta
  • Enum Route — ginustong pattern para sa organisasyon ng navigation
  • Heterogenous stack sa pamamagitan ng NavigationPath na may anumang Hashable na uri

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din