【问题标题】:SwiftUI Edit Item From List Using CoreDataSwiftUI 使用 CoreData 从列表中编辑项目
【发布时间】:2020-02-17 22:58:46
【问题描述】:

我正在开发一个列表应用程序,并且希望能够编辑列表项详细信息。我正在使用 CoreData 作为数据模型。现在我被困在如何将数据项从DetailView 传递到EditItemView。我将代码更新为我所处的当前状态。我目前在预览中标记为DetailView(myItem: item) 行的DetailView 中出现错误。我是否为name 正确设置@State 并正确传递@Binding?我认为我的错误在于我将EditItemView(name: self.$name) 中的名称传递给编辑视图的方式。想法?

详细视图:

import CoreData
import SwiftUI

struct DetailView: View {
    @Environment(\.managedObjectContext) var moc
    @ObservedObject var myItem: Item

    @State private var name: String
    @State private var showingEditScreen = false

    var body: some View {
        NavigationView {
            VStack {
                Text(self.myItem.name ?? "Unknown Item")
                Text(self.myItem.attribute ?? "Unknown attribute")
            }
        }
        .navigationBarTitle(Text(myItem.name ?? "Unknown Item"), displayMode: .inline)
        .navigationBarItems(trailing:
            Button(action: {
                self.showingEditScreen.toggle()
            }) {
                Image(systemName: "square.and.pencil")
            }
        )
        .sheet(isPresented: $showingEditScreen) {
            EditItemView(name: self.$name).environment(\.managedObjectContext, self.moc)
        }
    }
}

struct DetailView_Previews: PreviewProvider {
    static let moc = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)

    static var previews: some View {
        let item = Item(context: moc)
        item.name = "Test item"
        item.attribute = "Test attribute"

        return NavigationView {
            DetailView(myItem: item)
        }
    }
}

编辑项目视图:

import CoreData
import SwiftUI

struct EditItemView: View {
    @Binding var name: String

    var body: some View {
        TextField("Enter Item Name", text: self.$name)
    }
}

struct EditItemView_Previews: PreviewProvider {
    static var previews: some View {
        EditItemView(name: .constant("ItemX"))
    }
}

【问题讨论】:

  • 我更新了帖子中的代码。仍然出现错误。
  • 我得到的构建错误是:无法使用类型为“(myItem:Item)”的参数列表调用类型“DetailView”的初始化程序
  • 如果我在详细视图中注释掉@State private var name: String.sheet(isPresented: $showingEditScreen) {EditItemView(name: self.$name).environment(\.managedObjectContext, self.moc)},它将构建。我真的不知道将数据传递到下一个视图的正确语法是什么。

标签: listview core-data swiftui


【解决方案1】:

我会说 ItemNSManagedObject 是 ObservableObject。

所以你可以直接在视图中使用一个项目:

 struct EditItemView: View  {

     @ObservedObject var myItem : Item

      var body: some View {
       ...}

 }

【讨论】:

  • 错过了。添加但仍然不允许我构建项目并将其发送到编辑屏幕。
  • 哦,我错过了您在 EditItemView 中谈论的内容。我现在明白了。一旦我在 EditItemView 中设置了新的 @ObservedObject 并在 DetailView 中使用该名称来传递数据,它就工作得很好。非常感谢您的帮助!
猜你喜欢
  • 2021-05-22
  • 2020-11-05
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 2023-03-30
  • 2021-08-29
相关资源
最近更新 更多