Skip to content

Instantly share code, notes, and snippets.

@willtemperley
Last active February 13, 2025 08:43
Show Gist options
  • Save willtemperley/650908110bd50cc5b16fb13b57cf83b8 to your computer and use it in GitHub Desktop.
Save willtemperley/650908110bd50cc5b16fb13b57cf83b8 to your computer and use it in GitHub Desktop.
/// This code was created as an idiomatic version of the code demonstrated in this article:
/// https://medium.com/@robertdresler/swiftui-is-the-navigationstack-path-approach-incorrect-70ab8df8f5ac?sk=fb5869240884e1335520bc26acaaf454
import SwiftUI
@main
struct NavigationApp: App {
var body: some Scene {
WindowGroup {
StackView()
}
}
}
struct StackView: View {
@State var screens: [Screen] = [.screen1, .screen2]
enum Screen: CaseIterable {
case screen1
case screen2
case screen3
var name: String {
switch self {
case .screen1: return "Screen 1"
case .screen2: return "Screen 2"
case .screen3: return "Screen 3"
}
}
}
var body: some View {
if screens == [.screen3] {
Screen3View()
} else {
NavigationStack(path: $screens) {
List(Screen.allCases, id: \.self) { screen in
NavigationLink(screen.name, value: screen)
}
.navigationDestination(for: Screen.self) { screen in
switch screen {
case .screen1:
Screen1View()
case .screen2:
Screen2View()
.onTapGesture {
screens = [.screen3]
}
case .screen3:
Screen3View()
}
}
}
}
}
}
struct Screen1View: View {
var body: some View {
Text("Screen1")
}
}
struct Screen2View: View {
var body: some View {
Text("Screen2")
}
}
struct Screen3View: View {
var body: some View {
Text("Screen3")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment