SwiftUI 具有更改总是返回 true



我的代码如下。数据中的名字没有改变,但是有变化总是返回true,是不是我做错了什么?非常感谢您的帮助!

struct SwiftUI: View {
@Environment(.managedObjectContext) var moc
@Environment(.presentationMode) var pre: Binding<PresentationMode>
var data: CoreData
@State private var name = ""
var body: some View {
NavigationView {
HStack {
TextField("name", text: self.$name)
}.onAppear{
self.name = self.data.name ?? ""
}
Button(action: dataSave) {
HStack {
Text("Done")
}
}
}
}
func dataSave() {
self.data.name = self.name
if moc.hasChanges {
do {
try moc.save()
self.pre.wrappedValue.dismiss()
} catch { print(error.localizedDescription) }
} else {
self.pre.wrappedValue.dismiss()
}
}
}

为什么这里总是返回 true?

moc.hasChanges

当您在该上下文中分配给对象的任何属性时,NSManagedObjectContext.hasChanges设置为 true,即使该属性的值与以前相同。

您可以更改代码以执行:

if self.name != self.data.name {
self.data.name = self.name
}
if moc.hasChanges { /* ... */ }

或者,检查对象本身(而不是上下文(的hasPersistentChangedValues

self.data.name = self.name
if self.data.hasPersistentChangedValues {
do {
try moc.save()
self.pre.wrappedValue.dismiss()
} catch { print(error.localizedDescription) }
} else {
self.pre.wrappedValue.dismiss()
}
}

不幸的是,NSManagedObjectContext没有同等的hasPersistentChangedValues属性。第二种方法仅在您的示例中是合理的,而不是一般情况,在一般情况下,上下文中可能有许多对象可能已更改。

有关hasChangeshasPersistentChangedValues行为的更多信息,请参阅此答案:NSManagedObject 的 hasChanges 为真,而 changedValues 为空

最新更新