Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save MatthewWaller/365be84c004bb3d1516b18e5e148500d to your computer and use it in GitHub Desktop.
Save MatthewWaller/365be84c004bb3d1516b18e5e148500d to your computer and use it in GitHub Desktop.
Drilling Down with SwiftUI and Navigation Stack
import SwiftUI
struct CarDetail: Identifiable {
var id = UUID()
var info: String
}
struct CarYear: Identifiable {
var id = UUID()
var info: String
var detail: CarDetail
}
struct CarModel: Identifiable {
var id = UUID()
var info: String
var carYear: CarYear
}
struct CarMake: Identifiable {
var id = UUID()
var info: String
var carModel: CarModel
}
struct Car: Identifiable {
var id = UUID()
var info: String
var carMake: CarMake
}
class CarDatabase: ObservableObject {
@Published var cars: [Car]
init() {
let carDetail = CarDetail(info: "Heck of a car")
let carYear = CarYear(info: "88", detail: carDetail)
let carModel = CarModel(info: "Royale", carYear: carYear)
let carMake = CarMake(info: "Oldsmobile", carModel: carModel)
let car = Car(info: "My first car", carMake: carMake)
cars = [car]
}
}
@main
struct MyApp: App {
@StateObject var database = CarDatabase()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(database)
}
}
}
struct ContentView: View {
@EnvironmentObject var database: CarDatabase
var body: some View {
NavigationStack {
List(database.cars) { car in
NavigationLink(car.info) {
CarMakeView(carMake: car.carMake)
}
}
}
}
}
struct CarMakeView: View {
let carMake: CarMake
var body: some View {
VStack {
NavigationLink(carMake.info) {
CarModelView(carModel: carMake.carModel)
}
}
}
}
struct CarModelView: View {
let carModel: CarModel
var body: some View {
VStack {
NavigationLink(carModel.info) {
CarYearView(carYear: carModel.carYear)
}
}
}
}
struct CarYearView: View {
let carYear: CarYear
var body: some View {
VStack {
NavigationLink(carYear.info) {
CarDetailView(carDetail: carYear.detail)
}
}
}
}
struct CarDetailView: View {
let carDetail: CarDetail
var body: some View {
VStack {
Text(carDetail.info)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment