【问题标题】:SwiftUI hasChanges always return trueSwiftUI hasChanges 总是返回 true
【发布时间】:2020-05-17 15:18:54
【问题描述】:

我的代码如下。数据中的name没有变化,但是hasChanges总是返回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

【问题讨论】:

    标签: ios swift core-data swiftui


    【解决方案1】:

    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's hasChanges is true while changedValues is empty

    【讨论】:

    • 我明白了。解决了。非常感谢
    猜你喜欢
    • 2013-08-06
    • 2017-05-10
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多