Following the apple tutorial "Scrumdinger" app (https://developer.apple.com/tutorials/app-dev-training/creating-a-navigation-hierarchy) I've learned a great deal about displaying data within a list. However, I've run into a small problem. My project's navigation hierarchy/data models take a slightly more complex turn from the Scrumdinger app.
Here is the desired end state for "RateDetailView" which is a child view of "PayRateView." There should be one of these for the several aircraft fleet types:
The trouble I'm having is constructing my CardView to properly pull data from the Fleet Model. Once I get the CardView ironed out, everything else should populate appropriately.
Here is my latest attempt at a CardView (with errors):
struct RateCardView: View {
var fleet: Fleet
var body: some View {
ForEach(fleet.rates) { rate in
HStack {
Text("Year \(rate.year)")
Spacer()
Text("\(rate.foHourlyRate)")
Spacer()
Text("\(rate.captHourlyRate)")
}
}
}
}
Here is my Model data... it has an Array within an Array, which is where this diverges from the apple Scrumdinger tutorial:
struct Fleet: Identifiable {
let id: UUID
var fleetName: String
var rates: [HourlyRates]
init(id: UUID = UUID(), fleetName: String, rates: [HourlyRates]) {
self.id = id
self.fleetName = fleetName
self.rates = rates
}
}
extension Fleet {
static let fleetList: [Fleet] = [
Fleet(fleetName: "B717", rates: [HourlyRates(year: [1,2,3,4,5,6,7,8,9,10,11,12], foHourlyRate: [91,126,148,152,155,159,163,167,169,171,173,174], captHourlyRate: [0,235,236,238,240,242,244,246,248,250,252,254,256])]),
Fleet(fleetName: "B737-7/8", rates: [HourlyRates(year: [1,2,3,4,5,6,7,8,9,10,11,12], foHourlyRate: [91,126,148,152,155,159,163,167,169,171,173,174], captHourlyRate: [0,235,236,238,240,242,244,246,248,250,252,254,256])]),
Fleet(fleetName: "B737-9", rates: [HourlyRates(year: [1,2,3,4,5,6,7,8,9,10,11,12], foHourlyRate: [91,126,148,152,155,159,163,167,169,171,173,174], captHourlyRate: [0,235,236,238,240,242,244,246,248,250,252,254,256])]),
Fleet(fleetName: "B757", rates: [HourlyRates(year: [1,2,3,4,5,6,7,8,9,10,11,12], foHourlyRate: [91,126,148,152,155,159,163,167,169,171,173,174], captHourlyRate: [0,235,236,238,240,242,244,246,248,250,252,254,256])]),
Fleet(fleetName: "B767-4", rates: [HourlyRates(year: [1,2,3,4,5,6,7,8,9,10,11,12], foHourlyRate: [91,126,148,152,155,159,163,167,169,171,173,174], captHourlyRate: [0,235,236,238,240,242,244,246,248,250,252,254,256])]),
Fleet(fleetName: "A220", rates: [HourlyRates(year: [1,2,3,4,5,6,7,8,9,10,11,12], foHourlyRate: [91,126,148,152,155,159,163,167,169,171,173,174], captHourlyRate: [0,235,236,238,240,242,244,246,248,250,252,254,256])]),
Fleet(fleetName: "A319/320", rates: [HourlyRates(year: [1,2,3,4,5,6,7,8,9,10,11,12], foHourlyRate: [91,126,148,152,155,159,163,167,169,171,173,174], captHourlyRate: [0,235,236,238,240,242,244,246,248,250,252,254,256])]),
Fleet(fleetName: "A321", rates: [HourlyRates(year: [1,2,3,4,5,6,7,8,9,10,11,12], foHourlyRate: [91,126,148,152,155,159,163,167,169,171,173,174], captHourlyRate: [0,235,236,238,240,242,244,246,248,250,252,254,256])]),
Fleet(fleetName: "A330", rates: [HourlyRates(year: [1,2,3,4,5,6,7,8,9,10,11,12], foHourlyRate: [91,126,148,152,155,159,163,167,169,171,173,174], captHourlyRate: [0,235,236,238,240,242,244,246,248,250,252,254,256])]),
Fleet(fleetName: "A350", rates: [HourlyRates(year: [1,2,3,4,5,6,7,8,9,10,11,12], foHourlyRate: [91,126,148,152,155,159,163,167,169,171,173,174], captHourlyRate: [0,235,236,238,240,242,244,246,248,250,252,254,256])])
]
}
struct HourlyRates: Identifiable {
let id: UUID
var year: [Int]
var foHourlyRate: [Double]
var captHourlyRate: [Double]
init(id: UUID = UUID(), year: [Int], foHourlyRate: [Double], captHourlyRate: [Double]) {
self.id = id
self.year = year
self.foHourlyRate = foHourlyRate
self.captHourlyRate = captHourlyRate
}
}
My parent "PayRateView" should navigate to multiple child "RateDetailView"s for each fleet type:
struct PayRateView: View {
var fleet: [Fleet]
var body: some View {
NavigationView {
List {
ForEach(fleet, id: \.fleetName) { plane in
NavigationLink(destination: RateDetailView(fleet: fleet)) {
Text(plane.fleetName)
}
}
}
.navigationTitle("Delta Fleet Pay Rates")
}
}
}
Here is my PayRateDetailView:
struct RateDetailView: View {
var fleet: [Fleet]
var body: some View {
List {
ForEach (fleet, id: \.fleetName) { line in
RateCardView(fleet: fleet)
}
}
}
}
UPDATE:


