У меня тоже была такая же проблема. Я не уверен, почему, но это работает, что создание нового элемента в массиве, а не изменение самого элемента. Я подтвердил, что прямое обновление работает только в данных, но не для привязки пользовательского интерфейса.
В моем коде изменение элемента в TobuyData
классе.
class Tobuy: Identifiable {
let id = UUID()
var thing: String
var isDone = false
init(_ thing: String, isDone: Bool = false) {
self.thing = thing
self.isDone = isDone
}
}
class TobuyData: ObservableObject {
@Published var tobuys: [Tobuy]
init() {
self.tobuys = [
Tobuy("banana"),
Tobuy("bread"),
Tobuy("pencil"),
]
}
func toggleDone(_ tobuy: Tobuy) {
if let j = self.tobuys.firstIndex(where: { $0.id == tobuy.id }) {
self.tobuys[j] = Tobuy(self.tobuys[j].thing, isDone: !self.tobuys[j].isDone)
// self.tobuys[j].isDone.toggle() // this works only in data, but not for binding UI
}
}
}
В представлении
struct ContentView: View {
@EnvironmentObject var tobuyData: TobuyData
var body: some View {
List {
ForEach(tobuyData.tobuys) { tobuy in
Text(tobuy.thing)
.strikethrough(tobuy.isDone)
.onTapGesture { self.tobuyData.toggleDone(tobuy) }
...
ps
Изменение Tobuy
Class на Struct сделало прямое обновление элемента работающим, часть комментария выше. Это ссылка на официальный учебник Apple: «Обработка пользовательского ввода»