Hi
I have the interesting behaviour that a TextField updates changes to the bound data when the user presses enter after changing a value. The onCommit
code is then called. However, when one simply clicks off on another field after making the changes, the updates don’t happen. Clearly, I am doing something wrong. Any pointers greatly appreciated.
TextField("", value: $community.people[idx].age,
formatter: formatter,
onCommit: {
print("Committing data")
})
The data classes are as follows:
class Person: ObservableObject {
@Published var name:String
@Published var age:Int
@Published var gender:String
init(name:String, age:Int, gender:String) {
self.name = name
self.age = age
self.gender = gender
}
}
class Community: ObservableObject {
@Published var people:[Person] = [Person]()
@Published var aveAge:Double = 0
func calcAveAge() {
aveAge = 0
for i in 0..<people.count {
aveAge += Double(people[i].age) / Double(people.count)
}
}
init() {
self.people.append(Person(name: "John", age: 24, gender: "M"))
self.people.append(Person(name: "Sarah", age: 21, gender: "F"))
self.people.append(Person(name: "Charles", age: 65, gender: "M"))
}
}
and the view struct is as follows:
struct EditView: View {
@ObservedObject var community:Community
let formatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
return formatter
}()
var body: some View {
List {
ForEach(0..<community.people.count, id: \.self) { idx in
VStack {
HStack {
Text("Name:")
Spacer()
TextField("", text: $community.people[idx].name)
Spacer()
}
HStack {
Text("Age:")
TextField("", value: $community.people[idx].age, formatter: formatter,
onCommit: {
print("Committing data")
})
Spacer()
}
HStack {
Text("Gender:")
TextField("", text: $community.people[idx].gender)
Spacer()
}
}
}
}
}
}