Loading...
Loading...
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.
npx skill4agent add dpearson2699/swift-ios-skills swiftui-navigationNavigationStackNavigationPathHashable.navigationDestination(for:)struct ContentView: View {
@State private var path = NavigationPath()
var body: some View {
NavigationStack(path: $path) {
List(items) { item in
NavigationLink(value: item) {
ItemRow(item: item)
}
}
.navigationDestination(for: Item.self) { item in
DetailView(item: item)
}
.navigationTitle("Items")
}
}
}path.append(item) // Push
path.removeLast() // Pop one
path = NavigationPath() // Pop to root.environment().navigationDestination(for:)withAppRouter()references/navigationstack.mdNavigationSplitViewstruct MasterDetailView: View {
@State private var selectedItem: Item?
var body: some View {
NavigationSplitView {
List(items, selection: $selectedItem) { item in
NavigationLink(value: item) { ItemRow(item: item) }
}
.navigationTitle("Items")
} detail: {
if let item = selectedItem {
ItemDetailView(item: item)
} else {
ContentUnavailableView("Select an Item", systemImage: "sidebar.leading")
}
}
}
}HStackhorizontalSizeClass@MainActor
struct AppView: View {
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
@AppStorage("showSecondaryColumn") private var showSecondaryColumn = true
var body: some View {
HStack(spacing: 0) {
primaryColumn
if shouldShowSecondaryColumn {
Divider().edgesIgnoringSafeArea(.all)
secondaryColumn
}
}
}
private var shouldShowSecondaryColumn: Bool {
horizontalSizeClass == .regular
&& showSecondaryColumn
}
private var primaryColumn: some View {
TabView { /* tabs */ }
}
private var secondaryColumn: some View {
NotificationsTab()
.environment(\.isSecondaryColumn, true)
.frame(maxWidth: .secondaryColumnWidth)
}
}NavigationSplitView.sheet(item:).sheet(isPresented:)dismiss()@State private var selectedItem: Item?
.sheet(item: $selectedItem) { item in
EditItemSheet(item: item)
}.presentationSizing.sheet(item: $selectedItem) { item in
EditItemSheet(item: item)
.presentationSizing(.form) // .form, .page, .fitted, .automatic
}PresentationSizing.automatic.page.form.fitted.fitted(horizontal:vertical:).sticky(horizontal:vertical:).dismissalConfirmationDialog("Discard?", shouldPresent: hasUnsavedChanges)SheetDestinationIdentifiablereferences/sheets.mdTabNavigationStackstruct MainTabView: View {
@State private var selectedTab: AppTab = .home
var body: some View {
TabView(selection: $selectedTab) {
Tab("Home", systemImage: "house", value: .home) {
NavigationStack { HomeView() }
}
Tab("Search", systemImage: "magnifyingglass", value: .search) {
NavigationStack { SearchView() }
}
Tab("Profile", systemImage: "person", value: .profile) {
NavigationStack { ProfileView() }
}
}
}
}Tab(role: .search).tabBarMinimizeBehavior(_:).onScrollDown.onScrollUp.never.tabViewSidebarHeader/Footer.tabViewBottomAccessory { }TabSection.tabPlacement(.sidebarOnly)references/tabview.md/.well-known/apple-app-site-associationapplinks:example.com.onOpenURL.onContinueUserActivity@main
struct MyApp: App {
@State private var router = Router()
var body: some Scene {
WindowGroup {
ContentView()
.environment(router)
.onOpenURL { url in router.handle(url: url) }
.onContinueUserActivity(NSUserActivityTypeBrowsingWeb) { activity in
guard let url = activity.webpageURL else { return }
router.handle(url: url)
}
}
}
}Info.plistCFBundleURLTypes.onOpenURL.userActivity().onContinueUserActivity()Info.plistNSUserActivityTypesisEligibleForHandoff = truewebpageURLreferences/deeplinks.mdNavigationViewNavigationStackNavigationSplitViewNavigationPath.sheet(isPresented:).sheet(item:)NavigationPathHashable@Observable@Observable.tabItem { }Tab(value:)TabView(selection:)tabBarMinimizeBehavior.presentationSizing(.form)@MainActorNavigationStackNavigationViewNavigationStackHashable.navigationDestination(for:).sheet(item:).sheet(isPresented:)@MainActor@ObservableTab(value:)references/navigationstack.mdreferences/sheets.mdreferences/tabview.mdreferences/deeplinks.mdswiftui-patternsswiftui-layout-components