【问题标题】:How do I update a Core Data entity from a child view?如何从子视图更新核心数据实体?
【发布时间】:2020-11-10 06:35:45
【问题描述】:

我有一个带有name 字段的Thing 核心数据实体。当我在List 中显示[Thing] 时,我希望能够在子视图中编辑name。这是实现这一点的代码,但感觉就像糟糕的架构。 ThingView 应该真正通过 thing,而不是 thing.name

相反,我真的想将Thing 传递给ThingView,但如果我只是这样做,那么更新thing.name 不会导致视图更新,因为Thing 是一个引用类型。这里有关于简洁设计的想法吗?

struct ContentView: View {
  @ObservedObject var observableAllData: ObservableAllData
  var body: some View {
      NavigationView{List(observableAllData.allData.things.indices) { index in
        NavigationLink(destination:ThingView(
          thingName: $observableAllData.allData.things[index].name)) { 
            Text(observableAllData.allData.things[index].name)}
      }
    }
  }
}

struct ThingView: View {
  @Binding var thingName: String
  func updateThing() {
    thingName = "NEW"
  }
  var body: some View {
    VStack{
      Text(thingName)
      Button(action: updateThing) { Text("Update it!")}
    }
  }
}

编辑:澄清我想要ThingViewContentView 单击“更新”时进行更新。

【问题讨论】:

    标签: swift core-data swiftui


    【解决方案1】:

    您需要传入ThingView 完整的Thing 对象并在那里使用它而不是它的属性。这样您就可以对其进行更新和保存。

    所以

    struct ThingView: View {
      @ObservedObject var thing: Thing
    
      func updateThing() {
        thing.name = "NEW"
        try? thing.managedObjectContext?.save()
      }
      var body: some View {
        VStack{
          Text(thing.name)
          Button(action: updateThing) { Text("Update it!")}
        }
      }
    }
    

    在链接中

    NavigationLink(destination:ThingView(
      thing: observableAllData.allData.things[index])) { 
    

    更新: 模式是一样的,一切都依赖于 CoreData 实体放入单独的视图并使其观察到该实体。

    在您的扩展问题中/什么不是很礼貌;)/将行放入单独的视图中

    struct ThingRowView: View {
      @ObservedObject var thing: Thing
       var body: some View {
          NavigationLink(destination:ThingView(thing: thing) { 
                Text(thing.name)}
          }
       }
    }
    

    然后调用它

      NavigationView{List(observableAllData.allData.things.indices) { index in
         ThingRowView(thing: observableAllData.allData.things[index])
      }
    

    【讨论】:

    • 当我尝试这个时,我得到Cannot convert value of type 'Binding<Thing>' to expected argument type 'Thing'
    • 查看更新,我忘了从问题的复制代码中删除 $。
    • 谢谢!现在它运行:单击“更新它”确实现在更新ThingView但它不会更新父视图List)。相应地澄清了我希望两个视图都更新的问题。
    • 谢谢,它工作得很好。并且为编辑道歉,它并不是作为扩展,因为我对 SwiftUI 不够熟悉,这需要更改设计。真的很感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多