It works with the code I sent previously:
But you did not use what I proposed.
Problem is here:
why declare projects inside a single project ? That does not make sense, that must be global
what is this init() in Project: it sets the same short name for all ?
in TimeKeyinList, projects is not initialized
struct TimeKeyinList: View, Identifiable {
var id: String = "" // to ease test
var projects = [Project] ()
@State var isSet: [Bool] = [true, false, false, true]
@State private var hideTeco = false
var filteredProjects: [Project] {
// removeTECO project
projects.filter { project in
!project.isTeco
}}
var body: some View {
VStack {
ForEach(Array(filteredProjects.enumerated()), id: \.offset) { (row, project) in
TimeKeyInRow(id: project.shortname, project: project, isSet: $isSet[row])
}
}
.labelsHidden()
.onAppear() { // <<-- Added
for (row, project) in filteredProjects.enumerated() {
isSet[row] = !project.isTeco
}
}
}
}
struct Project: Identifiable {
var id: UUID = UUID()
var name: String
var shortname: String
var leftPMtime: Int
var isTeco: Bool
var projects = [
(id: UUID.init(), name: "Project1, isTeco = false, shortname = MORN, leftPMTime = 111",shortname : "MORN", leftPMtime : 111, isTeco: false),
(id: UUID.init(), name: "Project2, isTeco = true, shortname = IFF, leftPMTime = 222",shortname : "IFF", leftPMtime : 222, isTeco: true),
(id: UUID.init(), name: "Project3, isTeco = true, shortname = FFI, leftPMTime = 333",shortname : "FFI", leftPMtime : 333, isTeco: true),
(id: UUID.init(), name: "Project4, isTeco = false, shortname = IFFCO, leftPMTime = 444",shortname : "IFFCO", leftPMtime : 444, isTeco: false)
]
init(id: UUID, name: String, shortname: String, leftPMtime: Int, isTeco: Bool) {
self.id = id
self.name = "project1"
self.shortname = "MORN"
self.leftPMtime = 131
self.isTeco = true
}
}
So, the correct code is as follows (I modified slightly to show you how you could initialise projects:
struct TimeKeyInRow: View,Identifiable {
var id: String
var project: Project
/* Do not redeclare, that would hide the global projects var
var projects = [
Project(name: "Project1, isTeco = false, shortname = MORN, leftPMTime = 131",shortname : "MORN", leftPMtime : 131, isTeco: false),
Project(name: "Project2, isTeco = false, shortname = MORN, leftPMTime = 122",shortname : "IFF", leftPMtime : 122, isTeco: true),
Project(name: "Project3, isTeco = false, shortname = MORN, leftPMTime = 133",shortname : "FFI", leftPMtime : 133, isTeco: true),
Project(name: "Project4, isTeco = false, shortname = MORN, leftPMTime = 444",shortname : "IFFCO", leftPMtime : 444, isTeco: false)
] */
@Binding var isSet: Bool
let listOfPossibleHours: [Double] = [0.5, 1, 2, 3, 4, 8]
var body: some View {
HStack {
Spacer() // ADDED
Text(project.shortname.paddedToWidth(5)) // Text(projects[1].shortname)
.font(.custom("Menlo", size: 16)) // <<-- To get proper alignment
Spacer()
ForEach(listOfPossibleHours, id: \.self) { hour in
HourButton(id: "\(project.shortname)", isSet: isSet, value: hour)
}
Text("\(project.leftPMtime)")
.font(.custom("Menlo", size: 16)) // <<-- To get proper alignment
Spacer() // ADDED
}
}
}
struct TimeKeyinList: View, Identifiable {
var id: String = "" // to ease test
@State var projects = [Project] () // Now need a State var to be able to modify later
@State var isSet: [Bool] = [true, false, false, true]
@State private var hideTeco = false
var filteredProjects: [Project] {
// removeTECO project
projects.filter { project in
!project.isTeco
}}
var body: some View {
VStack(spacing: 10) {
ForEach(Array(filteredProjects.enumerated()), id: \.offset) { (row, project) in
TimeKeyInRow(id: project.shortname, project: project, isSet: $isSet[row])
}
}
.labelsHidden()
.onAppear() { // <<-- Added ; projects initialized here
projects = [
Project(name: "Project1, isTeco = false, shortname = MORN, leftPMTime = 131",shortname : "MORN", leftPMtime : 131, isTeco: false),
Project(name: "Project2, isTeco = false, shortname = MORN, leftPMTime = 122",shortname : "IFF", leftPMtime : 122, isTeco: true),
Project(name: "Project3, isTeco = false, shortname = MORN, leftPMTime = 133",shortname : "FFI", leftPMtime : 133, isTeco: true),
Project(name: "Project4, isTeco = false, shortname = MORN, leftPMTime = 444",shortname : "IFFCO", leftPMtime : 444, isTeco: false)
]
for (row, project) in filteredProjects.enumerated() {
isSet[row] = !project.isTeco
}
}
}
}
Note : if you want more space between rows, change :
var body: some View {
VStack(spacing: 10) { // <<-- more spacing
ForEach(Array(filteredProjects.enumerated()), id: \.offset) { (row, project) in
TimeKeyInRow(id: project.shortname, project: project, isSet: $isSet[row])
}
}