Last active
February 13, 2025 08:43
-
-
Save willtemperley/650908110bd50cc5b16fb13b57cf83b8 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// 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