【发布时间】:2020-02-27 08:28:38
【问题描述】:
如果我只是将 ItemView 的代码放在 ForEach 中,触摸列表项的名称,切换属性检查,更改名称颜色,它就可以正常工作。当我将代码提取到ItemView中时,数据发生了变化,但UI没有刷新,为什么?
请注意,Item 是类,而不是结构。也许这很重要。
import CoreData
class Item: NSManagedObject, Identifiable {
@NSManaged public var createAt: Date?
@NSManaged public var id: UUID?
@NSManaged public var name: String?
@NSManaged public var check: Bool
...
}
struct ContentView: View {
@Environment(\.managedObjectContext) var context
@FetchRequest(entity: Item.entity(), sortDescriptors: [NSSortDescriptor(key: "createAt", ascending: false)]) var items: FetchedResults<Item>
var body: some View {
NavigationView {
VStack {
List {
ForEach(items) { item in
// HStack {
// Text("\(item.name!)").foregroundColor(item.check ? .red : .gray)
// Spacer()
// }.onTapGesture {
// item.check.toggle()
// try? self.context.save()
// }
ItemView(item: item)
}.onDelete(perform: { indexSet in
let index = indexSet.first!
let item = self.items[index]
self.context.delete(item)
try? self.context.save()
})
}
Button(action: {
let item = Item(context: self.context)
item.id = UUID()
item.createAt = Date()
item.name = "New Item"
try? self.context.save()
}) {
Text("New")
}
}
}
}
}
struct ItemView: View {
@Environment(\.managedObjectContext) var context
var item: Item
var body: some View {
HStack {
Text("\(item.name!)").foregroundColor(item.check ? .red : .gray)
Spacer()
}.onTapGesture {
self.item.check.toggle()
try? self.context.save()
}
}
}
【问题讨论】: