SwiftUI 使用 CoreData 从列表中编辑项目

Posted

技术标签:

【中文标题】SwiftUI 使用 CoreData 从列表中编辑项目【英文标题】:SwiftUI Edit Item From List Using 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),它将构建。我真的不知道将数据传递到下一个视图的正确语法是什么。 【参考方案1】:

我会说 ItemNSManagedObject 是 ObservableObject。

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

 struct EditItemView: View  

     @ObservedObject var myItem : Item

      var body: some View 
       ...

 

【讨论】:

错过了。添加但仍然不允许我构建项目并将其发送到编辑屏幕。 哦,我错过了您在 EditItemView 中谈论的内容。我现在明白了。一旦我在 EditItemView 中设置了新的 @ObservedObject 并在 DetailView 中使用该名称来传递数据,它就工作得很好。非常感谢您的帮助!

以上是关于SwiftUI 使用 CoreData 从列表中编辑项目的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 移动列表单元格并在 CoreData 数据库中填充顺序

SwiftUI CoreData 过滤列表删除意外失败

Swiftui中CoreData关系和显示图像列表

SwiftUI 如何使 CoreData 列表在 macOS 上可选择和可双击

SwiftUI CoreData - 如何更新获取请求和列表

SwiftUI - 如何在 CoreData 中删除实体中的行