Это потому, что ItemView
по умолчанию определено как равное, потому что свойство item
является указателем.
Вот что можно сделать (снимок не проверяется), поэтому просто поцарапано (но должно опыт работы):
1) измените ForEach
следующим образом
ForEach(items) { item in
ItemView(item: item).equatable()
2) [!!!] убедитесь, что ваш Item
также Equatable
с учетом изменений check
свойство
3) сделать ItemView
равным
struct ItemView: View, Equatable {
static func == (lhs: ItemView, rhs: ItemView) -> Bool {
return lhs.item == rhs.item // preferable, but can be other appropriate
}
...
Обновление: альтернативный способ
struct ItemView: View {
@Environment(\.managedObjectContext) var context
var item: Item
@State private var refresh: Bool = true
var body: some View {
HStack {
Text("\(item.name!)").foregroundColor(item.check ? .red : .gray)
.background(Color.clear.opacity(self.refresh ? 1.0 : 0.0)) // just to be in view body
Spacer()
}.onTapGesture {
self.item.check.toggle()
try? self.context.save()
self.refresh.toggle() // force refresh self
}
}
}