问题
'@Environment(.managedObjectContext) var context' will monitor the changes of context. When I click the button to toggle isPublic, I think it will cause to UI refreshing, Button text will change, But not, WHY?
struct BookInfoView: View {
@Environment(\.managedObjectContext) var context
var isPublic: Bool { return book.isPublic }
let book: Book
var body: some View {
print("refresh"); return
Group {
Button(action: onPublicToggled) {
Text(isPublic ? "private" : "public")
}
}
}
func onPublicToggled() {
context.perform {
book.isPublic.toggle()
try? context.save()
}
}
}
回答1:
You need to observe a Book
changes via ObservedObject
wrapper, like
struct BookInfoView: View {
@Environment(\.managedObjectContext) var context
@ObservedObject var book: Book
var body: some View {
print("refresh"); return
Group {
Button(action: onPublicToggled) {
Text(book.isPublic ? "private" : "public")
}
}
}
func onPublicToggled() {
context.perform {
book.isPublic.toggle()
try? context.save()
}
}
}
Note: @Environment(\.managedObjectContext) var context
relates to context
itself, not to your CoreData objects.
来源:https://stackoverflow.com/questions/65650902/coredata-why-not-refresh-ui-when-book-ispublic-toggled