{"id":"fd7b3d04-80df-4694-8778-506299bf7e18","shortId":"6CgpyB","kind":"skill","title":"swiftui-navigation","tagline":"Implement SwiftUI navigation patterns including NavigationStack, NavigationSplitView, sheet presentation, tab-based navigation, and deep linking. Use when building push navigation, programmatic routing, multi-column layouts, modal sheets, tab bars, universal links, or custom URL ","description":"# SwiftUI Navigation\n\nNavigation patterns for SwiftUI apps targeting iOS 26+ with Swift 6.3. Covers push navigation, multi-column layouts, sheet presentation, tab architecture, and deep linking. Patterns are backward-compatible to iOS 17 unless noted.\n\n## Contents\n\n- [NavigationStack (Push Navigation)](#navigationstack-push-navigation)\n- [NavigationSplitView (Multi-Column)](#navigationsplitview-multi-column)\n- [Sheet Presentation](#sheet-presentation)\n- [Tab-Based Navigation](#tab-based-navigation)\n- [Deep Links](#deep-links)\n- [Common Mistakes](#common-mistakes)\n- [Review Checklist](#review-checklist)\n- [References](#references)\n\n## NavigationStack (Push Navigation)\n\nUse `NavigationStack` with a `NavigationPath` binding for programmatic, type-safe push navigation. Define routes as a `Hashable` enum and map them with `.navigationDestination(for:)`.\n\n```swift\nstruct ContentView: View {\n    @State private var path = NavigationPath()\n\n    var body: some View {\n        NavigationStack(path: $path) {\n            List(items) { item in\n                NavigationLink(value: item) {\n                    ItemRow(item: item)\n                }\n            }\n            .navigationDestination(for: Item.self) { item in\n                DetailView(item: item)\n            }\n            .navigationTitle(\"Items\")\n        }\n    }\n}\n```\n\n**Programmatic navigation:**\n\n```swift\npath.append(item)        // Push\npath.removeLast()        // Pop one\npath = NavigationPath()  // Pop to root\n```\n\n**Router pattern:** For apps with complex navigation, use a router object that owns the path and sheet state. Each tab gets its own router instance injected via `.environment()`. Centralize destination mapping with a single `.navigationDestination(for:)` block or a shared `withAppRouter()` modifier.\n\nSee [references/navigationstack.md](references/navigationstack.md) for full router examples including per-tab stacks, centralized destination mapping, and generic tab routing.\n\n## NavigationSplitView (Multi-Column)\n\nUse `NavigationSplitView` for sidebar-detail layouts on iPad and Mac. Falls back to stack navigation on iPhone.\n\n```swift\nstruct MasterDetailView: View {\n    @State private var selectedItem: Item?\n\n    var body: some View {\n        NavigationSplitView {\n            List(items, selection: $selectedItem) { item in\n                NavigationLink(value: item) { ItemRow(item: item) }\n            }\n            .navigationTitle(\"Items\")\n        } detail: {\n            if let item = selectedItem {\n                ItemDetailView(item: item)\n            } else {\n                ContentUnavailableView(\"Select an Item\", systemImage: \"sidebar.leading\")\n            }\n        }\n    }\n}\n```\n\n### Custom Split Column (Manual HStack)\n\nFor custom multi-column layouts (e.g., a dedicated notification column independent of selection), use a manual `HStack` split with `horizontalSizeClass` checks:\n\n```swift\n@MainActor\nstruct AppView: View {\n  @Environment(\\.horizontalSizeClass) private var horizontalSizeClass\n  @AppStorage(\"showSecondaryColumn\") private var showSecondaryColumn = true\n\n  var body: some View {\n    HStack(spacing: 0) {\n      primaryColumn\n      if shouldShowSecondaryColumn {\n        Divider().edgesIgnoringSafeArea(.all)\n        secondaryColumn\n      }\n    }\n  }\n\n  private var shouldShowSecondaryColumn: Bool {\n    horizontalSizeClass == .regular\n      && showSecondaryColumn\n  }\n\n  private var primaryColumn: some View {\n    TabView { /* tabs */ }\n  }\n\n  private var secondaryColumn: some View {\n    NotificationsTab()\n      .environment(\\.isSecondaryColumn, true)\n      .frame(maxWidth: .secondaryColumnWidth)\n  }\n}\n```\n\nUse the manual HStack split when you need full control or a non-standard secondary column. Use `NavigationSplitView` when you want a standard system layout with minimal customization.\n\n## Sheet Presentation\n\nPrefer `.sheet(item:)` over `.sheet(isPresented:)` when state represents a selected model. Sheets should own their actions and call `dismiss()` internally.\n\n```swift\n@State private var selectedItem: Item?\n\n.sheet(item: $selectedItem) { item in\n    EditItemSheet(item: item)\n}\n```\n\n**Presentation sizing (iOS 18+):** Control sheet dimensions with `.presentationSizing`:\n\n```swift\n.sheet(item: $selectedItem) { item in\n    EditItemSheet(item: item)\n        .presentationSizing(.form)  // .form, .page, .fitted, .automatic\n}\n```\n\n`PresentationSizing` values:\n- `.automatic` -- platform default\n- `.page` -- roughly paper size, for informational content\n- `.form` -- slightly narrower than page, for form-style UI\n- `.fitted` -- sized by the content's ideal size\n\nFine-tuning: `.fitted(horizontal:vertical:)` constrains fitting axes; `.sticky(horizontal:vertical:)` grows but does not shrink in specified dimensions.\n\n**Dismissal confirmation (macOS 15+ / iOS 26+):** Use `.dismissalConfirmationDialog(\"Discard?\", shouldPresent: hasUnsavedChanges)` to prevent accidental dismissal of sheets with unsaved changes.\n\n**Enum-driven sheet routing:** Define a `SheetDestination` enum that is `Identifiable`, store it on the router, and map it with a shared view modifier. This lets any child view present sheets without prop-drilling. See [references/sheets.md](references/sheets.md) for the full centralized sheet routing pattern.\n\n## Tab-Based Navigation\n\nUse the `Tab` API with a selection binding for scalable tab architecture. Each tab should wrap its content in an independent `NavigationStack`.\n\n```swift\nstruct MainTabView: View {\n    @State private var selectedTab: AppTab = .home\n\n    var body: some View {\n        TabView(selection: $selectedTab) {\n            Tab(\"Home\", systemImage: \"house\", value: .home) {\n                NavigationStack { HomeView() }\n            }\n            Tab(\"Search\", systemImage: \"magnifyingglass\", value: .search) {\n                NavigationStack { SearchView() }\n            }\n            Tab(\"Profile\", systemImage: \"person\", value: .profile) {\n                NavigationStack { ProfileView() }\n            }\n        }\n    }\n}\n```\n\n**Custom binding with side effects:** Route selection changes through a function to intercept special tabs (e.g., compose) that should trigger an action instead of changing selection.\n\n### iOS 26 Tab Additions\n\n- **`Tab(role: .search)`** -- replaces the tab bar with a search field when active\n- **`.tabBarMinimizeBehavior(_:)`** -- `.onScrollDown`, `.onScrollUp`, `.never` (iPhone only)\n- **`.tabViewSidebarHeader/Footer`** -- customize sidebar sections on iPadOS/macOS\n- **`.tabViewBottomAccessory { }`** -- attach content below the tab bar (e.g., Now Playing bar)\n- **`TabSection`** -- group tabs into sidebar sections with `.tabPlacement(.sidebarOnly)`\n\nSee [references/tabview.md](references/tabview.md) for full TabView patterns including custom bindings, dynamic tabs, and sidebar customization.\n\n## Deep Links\n\n### Universal Links\n\nUniversal links let iOS open your app for standard HTTPS URLs. They require:\n1. An Apple App Site Association (AASA) file at `/.well-known/apple-app-site-association`\n2. An Associated Domains entitlement (`applinks:example.com`)\n\nHandle in SwiftUI with `.onOpenURL` and `.onContinueUserActivity`:\n\n```swift\n@main\nstruct MyApp: App {\n    @State private var router = Router()\n\n    var body: some Scene {\n        WindowGroup {\n            ContentView()\n                .environment(router)\n                .onOpenURL { url in router.handle(url: url) }\n                .onContinueUserActivity(NSUserActivityTypeBrowsingWeb) { activity in\n                    guard let url = activity.webpageURL else { return }\n                    router.handle(url: url)\n                }\n        }\n    }\n}\n```\n\n### Custom URL Schemes\n\nRegister schemes in `Info.plist` under `CFBundleURLTypes`. Handle with `.onOpenURL`. Prefer universal links over custom schemes for publicly shared links -- they provide web fallback and domain verification.\n\n### Handoff (NSUserActivity)\n\nAdvertise activities with `.userActivity()` and receive them with `.onContinueUserActivity()`. Declare activity types in `Info.plist` under `NSUserActivityTypes`. Set `isEligibleForHandoff = true` and provide a `webpageURL` as fallback.\n\nSee [references/deeplinks.md](references/deeplinks.md) for full examples of AASA configuration, router URL handling, custom URL schemes, and NSUserActivity continuation.\n\n## Common Mistakes\n\n1. Using deprecated `NavigationView` -- use `NavigationStack` or `NavigationSplitView`\n2. Sharing one `NavigationPath` across all tabs -- each tab needs its own path\n3. Using `.sheet(isPresented:)` when state represents a model -- use `.sheet(item:)` instead\n4. Storing view instances in `NavigationPath` -- store lightweight `Hashable` route data\n5. Nesting `@Observable` router objects inside other `@Observable` objects\n6. Prefer `Tab(value:)` with `TabView(selection:)` over the older `.tabItem { }` API\n7. Assuming `tabBarMinimizeBehavior` works on iPad -- it is iPhone only\n8. Handling deep links in multiple places -- centralize URL parsing in the router\n9. Hard-coding sheet frame dimensions -- use `.presentationSizing(.form)` instead\n10. Missing `@MainActor` on router classes -- required for Swift 6 concurrency safety\n\n## Review Checklist\n\n- [ ] `NavigationStack` used (not `NavigationView`)\n- [ ] Each tab has its own `NavigationStack` with independent path\n- [ ] Route enum is `Hashable` with stable identifiers\n- [ ] `.navigationDestination(for:)` maps all route types\n- [ ] `.sheet(item:)` preferred over `.sheet(isPresented:)`\n- [ ] Sheets own their dismiss logic internally\n- [ ] Router object is `@MainActor` and `@Observable`\n- [ ] Deep link URLs parsed and validated before navigation\n- [ ] Universal links have AASA and Associated Domains configured\n- [ ] Tab selection uses `Tab(value:)` with binding\n\n## References\n\n- NavigationStack and router patterns: [references/navigationstack.md](references/navigationstack.md)\n- Sheet presentation and routing: [references/sheets.md](references/sheets.md)\n- TabView patterns and iOS 26 API: [references/tabview.md](references/tabview.md)\n- Deep links, universal links, and Handoff: [references/deeplinks.md](references/deeplinks.md)\n- Architecture and state management: see `swiftui-patterns` skill\n- Layout and components: see `swiftui-layout-components` skill","tags":["swiftui","navigation","swift","ios","skills","dpearson2699","accessibility","agent-skills","ai-coding","apple","claude-code","codex-skills"],"capabilities":["skill","source-dpearson2699","skill-swiftui-navigation","topic-accessibility","topic-agent-skills","topic-ai-coding","topic-apple","topic-claude-code","topic-codex-skills","topic-cursor-skills","topic-ios","topic-ios-development","topic-liquid-glass","topic-localization","topic-mapkit"],"categories":["swift-ios-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/dpearson2699/swift-ios-skills/swiftui-navigation","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add dpearson2699/swift-ios-skills","source_repo":"https://github.com/dpearson2699/swift-ios-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 599 github stars · SKILL.md body (10,267 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:53:45.878Z","embedding":null,"createdAt":"2026-04-18T20:33:46.794Z","updatedAt":"2026-05-18T18:53:45.878Z","lastSeenAt":"2026-05-18T18:53:45.878Z","tsv":"'/.well-known/apple-app-site-association':799 '0':376 '1':790,927 '10':1027 '15':553 '17':74 '18':479 '2':800,935 '26':49,555,710,1125 '3':948 '4':961 '5':972 '6':981,1036 '6.3':52 '7':993 '8':1003 '9':1016 'aasa':796,914,1096 'accident':563 'across':939 'action':457,704 'activ':725,840,883,892 'activity.webpageurl':845 'addit':712 'advertis':882 'api':623,992,1126 'app':46,204,783,793,818 'appl':792 'applink':805 'appstorag':364 'apptab':650 'appview':357 'architectur':63,631,1137 'associ':795,802,1098 'assum':994 'attach':739 'automat':499,502 'axe':538 'back':278 'backward':70 'backward-compat':69 'bar':34,719,744,748 'base':15,100,104,618 'bind':131,627,684,767,1107 'block':237 'bodi':161,294,371,653,825 'bool':387 'build':22 'call':459 'central':229,255,612,1010 'cfbundleurltyp':859 'chang':569,690,707 'check':353 'checklist':117,120,1040 'child':598 'class':1032 'code':1019 'column':29,58,88,92,265,329,336,342,426 'common':111,114,925 'common-mistak':113 'compat':71 'complex':206 'compon':1148,1153 'compos':699 'concurr':1037 'configur':915,1100 'confirm':551 'constrain':536 'content':77,511,526,637,740 'contentunavailableview':321 'contentview':153,829 'continu':924 'control':419,480 'cover':53 'custom':38,327,333,438,683,733,766,772,851,867,919 'data':971 'declar':891 'dedic':340 'deep':18,65,106,109,773,1005,1085,1129 'deep-link':108 'default':504 'defin':139,575 'deprec':929 'destin':230,256 'detail':271,312 'detailview':182 'dimens':482,549,1022 'discard':558 'dismiss':460,550,564,1076 'dismissalconfirmationdialog':557 'divid':380 'domain':803,878,1099 'drill':605 'driven':572 'dynam':768 'e.g':338,698,745 'edgesignoringsafearea':381 'edititemsheet':473,491 'effect':687 'els':320,846 'entitl':804 'enum':144,571,578,1055 'enum-driven':570 'environ':228,359,404,830 'exampl':249,912 'example.com':806 'fall':277 'fallback':876,906 'field':723 'file':797 'fine':531 'fine-tun':530 'fit':498,522,533,537 'form':495,496,512,519,1025 'form-styl':518 'frame':407,1021 'full':247,418,611,762,911 'function':693 'generic':259 'get':221 'group':750 'grow':542 'guard':842 'handl':807,860,918,1004 'handoff':880,1134 'hard':1018 'hard-cod':1017 'hashabl':143,969,1057 'hasunsavedchang':560 'home':651,660,664 'homeview':666 'horizont':534,540 'horizontalsizeclass':352,360,363,388 'hous':662 'hstack':331,349,374,413 'https':786 'ideal':528 'identifi':581,1060 'implement':4 'includ':8,250,765 'independ':343,640,1052 'info.plist':857,895 'inform':510 'inject':226 'insid':977 'instanc':225,964 'instead':705,960,1026 'intercept':695 'intern':461,1078 'io':48,73,478,554,709,780,1124 'ipad':274,998 'ipados/macos':737 'iphon':283,730,1001 'iseligibleforhandoff':899 'ispres':446,951,1072 'issecondarycolumn':405 'item':168,169,173,175,176,180,183,184,186,191,292,299,302,306,308,309,311,315,318,319,324,443,467,469,471,474,475,487,489,492,493,959,1068 'item.self':179 'itemdetailview':317 'itemrow':174,307 'layout':30,59,272,337,435,1146,1152 'let':314,596,779,843 'lightweight':968 'link':19,36,66,107,110,774,776,778,865,872,1006,1086,1094,1130,1132 'list':167,298 'logic':1077 'mac':276 'maco':552 'magnifyingglass':670 'main':815 'mainactor':355,1029,1082 'maintabview':644 'manag':1140 'manual':330,348,412 'map':146,231,257,588,1063 'masterdetailview':286 'maxwidth':408 'minim':437 'miss':1028 'mistak':112,115,926 'modal':31 'model':452,956 'modifi':242,594 'multi':28,57,87,91,264,335 'multi-column':27,56,86,263,334 'multipl':1008 'myapp':817 'narrow':514 'navig':3,6,16,24,41,42,55,80,84,101,105,125,138,188,207,281,619,1092 'navigationdestin':149,177,235,1061 'navigationlink':171,304 'navigationpath':130,159,197,938,966 'navigationsplitview':10,85,90,262,267,297,428,934 'navigationsplitview-multi-column':89 'navigationstack':9,78,82,123,127,164,641,665,673,681,932,1041,1050,1109 'navigationstack-push-navig':81 'navigationtitl':185,310 'navigationview':930,1044 'need':417,944 'nest':973 'never':729 'non':423 'non-standard':422 'note':76 'notif':341 'notificationstab':403 'nsuseract':881,923 'nsuseractivitytyp':897 'nsuseractivitytypebrowsingweb':839 'object':211,976,980,1080 'observ':974,979,1084 'older':990 'oncontinueuseract':813,838,890 'one':195,937 'onopenurl':811,832,862 'onscrolldown':727 'onscrollup':728 'open':781 'own':213 'page':497,505,516 'paper':507 'pars':1012,1088 'path':158,165,166,196,215,947,1053 'path.append':190 'path.removelast':193 'pattern':7,43,67,202,615,764,1112,1122,1144 'per':252 'per-tab':251 'person':678 'place':1009 'platform':503 'play':747 'pop':194,198 'prefer':441,863,982,1069 'present':12,61,94,97,440,476,600,1116 'presentations':484,494,500,1024 'prevent':562 'primarycolumn':377,393 'privat':156,289,361,366,384,391,398,464,647,820 'profil':676,680 'profileview':682 'programmat':25,133,187 'prop':604 'prop-dril':603 'provid':874,902 'public':870 'push':23,54,79,83,124,137,192 'receiv':887 'refer':121,122,1108 'references/deeplinks.md':908,909,1135,1136 'references/navigationstack.md':244,245,1113,1114 'references/sheets.md':607,608,1119,1120 'references/tabview.md':759,760,1127,1128 'regist':854 'regular':389 'replac':716 'repres':449,954 'requir':789,1033 'return':847 'review':116,119,1039 'review-checklist':118 'role':714 'root':200 'rough':506 'rout':26,140,261,574,614,688,970,1054,1065,1118 'router':201,210,224,248,586,822,823,831,916,975,1015,1031,1079,1111 'router.handle':835,848 'safe':136 'safeti':1038 'scalabl':629 'scene':827 'scheme':853,855,868,921 'search':668,672,715,722 'searchview':674 'secondari':425 'secondarycolumn':383,400 'secondarycolumnwidth':409 'section':735,754 'see':243,606,758,907,1141,1149 'select':300,322,345,451,626,657,689,708,987,1102 'selecteditem':291,301,316,466,470,488 'selectedtab':649,658 'set':898 'share':240,592,871,936 'sheet':11,32,60,93,96,217,439,442,445,453,468,481,486,566,573,601,613,950,958,1020,1067,1071,1073,1115 'sheet-present':95 'sheetdestin':577 'shouldpres':559 'shouldshowsecondarycolumn':379,386 'showsecondarycolumn':365,368,390 'shrink':546 'side':686 'sidebar':270,734,753,771 'sidebar-detail':269 'sidebar.leading':326 'sidebaron':757 'singl':234 'site':794 'size':477,508,523,529 'skill':1145,1154 'skill-swiftui-navigation' 'slight':513 'source-dpearson2699' 'space':375 'special':696 'specifi':548 'split':328,350,414 'stabl':1059 'stack':254,280 'standard':424,433,785 'state':155,218,288,448,463,646,819,953,1139 'sticki':539 'store':582,962,967 'struct':152,285,356,643,816 'style':520 'swift':51,151,189,284,354,462,485,642,814,1035 'swiftui':2,5,40,45,809,1143,1151 'swiftui-layout-compon':1150 'swiftui-navig':1 'swiftui-pattern':1142 'system':434 'systemimag':325,661,669,677 'tab':14,33,62,99,103,220,253,260,397,617,622,630,633,659,667,675,697,711,713,718,743,751,769,941,943,983,1046,1101,1104 'tab-bas':13,98,616 'tab-based-navig':102 'tabbarminimizebehavior':726,995 'tabitem':991 'tabplac':756 'tabsect':749 'tabview':396,656,763,986,1121 'tabviewbottomaccessori':738 'tabviewsidebarheader/footer':732 'target':47 'topic-accessibility' 'topic-agent-skills' 'topic-ai-coding' 'topic-apple' 'topic-claude-code' 'topic-codex-skills' 'topic-cursor-skills' 'topic-ios' 'topic-ios-development' 'topic-liquid-glass' 'topic-localization' 'topic-mapkit' 'trigger':702 'true':369,406,900 'tune':532 'type':135,893,1066 'type-saf':134 'ui':521 'univers':35,775,777,864,1093,1131 'unless':75 'unsav':568 'url':39,787,833,836,837,844,849,850,852,917,920,1011,1087 'use':20,126,208,266,346,410,427,556,620,928,931,949,957,1023,1042,1103 'useract':885 'valid':1090 'valu':172,305,501,663,671,679,984,1105 'var':157,160,290,293,362,367,370,385,392,399,465,648,652,821,824 'verif':879 'vertic':535,541 'via':227 'view':154,163,287,296,358,373,395,402,593,599,645,655,963 'want':431 'web':875 'webpageurl':904 'windowgroup':828 'withapprout':241 'without':602 'work':996 'wrap':635","prices":[{"id":"56c51513-6f2e-4481-9681-f69268c2eb3a","listingId":"fd7b3d04-80df-4694-8778-506299bf7e18","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"dpearson2699","category":"swift-ios-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T20:33:46.794Z"}],"sources":[{"listingId":"fd7b3d04-80df-4694-8778-506299bf7e18","source":"github","sourceId":"dpearson2699/swift-ios-skills/swiftui-navigation","sourceUrl":"https://github.com/dpearson2699/swift-ios-skills/tree/main/skills/swiftui-navigation","isPrimary":false,"firstSeenAt":"2026-04-18T22:01:26.061Z","lastSeenAt":"2026-05-18T18:53:45.878Z"},{"listingId":"fd7b3d04-80df-4694-8778-506299bf7e18","source":"skills_sh","sourceId":"dpearson2699/swift-ios-skills/swiftui-navigation","sourceUrl":"https://skills.sh/dpearson2699/swift-ios-skills/swiftui-navigation","isPrimary":true,"firstSeenAt":"2026-04-18T20:33:46.794Z","lastSeenAt":"2026-05-07T22:40:32.549Z"}],"details":{"listingId":"fd7b3d04-80df-4694-8778-506299bf7e18","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"dpearson2699","slug":"swiftui-navigation","github":{"repo":"dpearson2699/swift-ios-skills","stars":599,"topics":["accessibility","agent-skills","ai-coding","apple","claude-code","codex-skills","cursor-skills","ios","ios-development","liquid-glass","localization","mapkit","networking","storekit","swift","swift-concurrency","swiftdata","swiftui","widgetkit","xcode"],"license":"other","html_url":"https://github.com/dpearson2699/swift-ios-skills","pushed_at":"2026-04-26T21:04:17Z","description":"Agent Skills for iOS 26+, Swift 6.3, SwiftUI, and modern Apple frameworks","skill_md_sha":"bb42f9a4363400114b798e90ed91153fd86f282d","skill_md_path":"skills/swiftui-navigation/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/dpearson2699/swift-ios-skills/tree/main/skills/swiftui-navigation"},"layout":"multi","source":"github","category":"swift-ios-skills","frontmatter":{"name":"swiftui-navigation","description":"Implement SwiftUI navigation patterns including NavigationStack, NavigationSplitView, sheet presentation, tab-based navigation, and deep linking. Use when building push navigation, programmatic routing, multi-column layouts, modal sheets, tab bars, universal links, or custom URL scheme handling."},"skills_sh_url":"https://skills.sh/dpearson2699/swift-ios-skills/swiftui-navigation"},"updatedAt":"2026-05-18T18:53:45.878Z"}}