I have a Set Model:
@Model
class Set: Identifiable{
var id: UUID
var weight: Int
var reps: Int
var isCompleted: Bool
// var exercise: Exercise? //it can belong to a work but it doesnt have to
init(id: UUID, weight: Int, reps: Int,isCompleted: Bool) {
self.id = id
self.weight = weight
self.reps = reps
self.isCompleted = isCompleted
}
}
And I am going to allow the user to edit a bunch or list Items based on a temporary array of Sets and when the user is done they sets array will be written to the passed Exercise objects sets array, For now I am using a binding in the ForEach because I want the Textfields to directly control the current object as soon as something is typed into it.
The code:
@Environment(.modelContext) var modelContext
@Environment(.dismiss) var dismiss
var exercise: Exercise
//The user will temporarily write to this sets array than after he is done we will save it to exercises
@State private var sets: [Set] = [Set(id: UUID(), weight: 0, reps: 0,isCompleted: false),Set(id: UUID(), weight: 0, reps: 0, isCompleted: false)]
List {
ForEach($sets){ $set in
HStack(spacing: 10) {
Image(
systemName: set.isCompleted ?
"checkmark.circle" :
"circle"
)
.foregroundStyle(set.isCompleted ? .blue : .black)
.imageScale(.large)
.onTapGesture {
set.isCompleted.toggle()
}
//Enter KG
HStack {
VStack(alignment: .leading){
Text("Kg")
.foregroundStyle(.gray)
.font(.subheadline)
TextField("(set.weight)", value: $set.weight, formatter: NumberFormatter())
}
.frame(width: 45)
.padding(.leading)
//.background(.yellow)
//Enter Reps
VStack(alignment: .leading) {
Text("Reps")
.foregroundStyle(.gray)
.font(.subheadline)
TextField("(set.reps)", value: $set.reps, formatter: NumberFormatter())
}
.frame(width: 45)
//.background(.blue)
}
Spacer()
.background(.red)
Spacer()
//Button to dublicate the current set and add it to the list
Button {
let weight = $set.weight
let reps = $set.reps
let newSet = Set(id: UUID(),weight: weight, reps: reps, isCompleted: false)
sets.append(newSet)
}
label: {
Image(systemName: "plus.rectangle.on.rectangle")
}
}
}
Section {
Button{
//Adding a New Set to the Temporary Array
let newSet = Set(id: UUID(), weight: 0, reps: 0,isCompleted: false)
sets.append(newSet)
}label: {
Text("Add set")
.fontWeight(.semibold)
.underline()
}
}
}
.listStyle(.insetGrouped)
The issue comes in this code and it says : Cannot convert value of type ‘Binding’ to expected argument type ‘Int’
//Button to dublicate the current set and add it to the list
Button {
let weight = $set.weight
let reps = $set.reps
let newSet = Set(id: UUID(),weight: weight, reps: reps, isCompleted: false)
sets.append(newSet)
}
label: {
Image(systemName: "plus.rectangle.on.rectangle")
}
How do you allow Textfield to directly manipulate the data in the current iteration of the List without needing temporary variable and “done” buttons