Hello, don't need to add multiple state vars, just creates an published array and initialized with your data.
Create a Model:
struct ReviewModel {
var reviewScore: String
var reviewCrieteria: String
var scoreNotes: String
}
Create a ViewModel:
class ReviewManager: ObservableObject {
@Published var reviews: [ReviewModel]
static var reviewCriterias = ["Communication", "Time Management", "Work Ethic", "Creativity", "Teamwork"]
var reviewScore = ["Terrible", "Poor", "Average", "Good", "Excellent"]
init() {
self.reviews = ReviewManager.getData()
}
static func getData() -> [ReviewModel] {
reviewCriterias.map { criteria in
ReviewModel(
reviewScore: "Poor",
reviewCrieteria: criteria,
scoreNotes: ""
)
}
}
}
And use them in your view:
struct CandidateReview: View {
var candidateName = "John Doe"
@ObservedObject var reviewObj = ReviewManager()
var body: some View {
if #available(iOS 16.0, *) {
NavigationStack{
Form{
ForEach(reviewObj.reviews.indices, id: \.self) { index in
Section(header: Text(reviewObj.reviews[index].reviewCrieteria)){
Picker("\(reviewObj.reviews[index].reviewCrieteria) Score", selection: $reviewObj.reviews[index].reviewScore){
ForEach(reviewObj.reviewScore, id: \.self){
Text($0)
}
}
TextField("\(reviewObj.reviews[index].reviewCrieteria) Notes...", text: $reviewObj.reviews[index].scoreNotes)
}
}
}
.navigationTitle(candidateName)
}
} else {
// Fallback on earlier versions
}
}
}