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】:
我会说 Item
或 NSManagedObject
是 ObservableObject。
所以你可以直接在视图中使用一个项目:
struct EditItemView: View
@ObservedObject var myItem : Item
var body: some View
...
【讨论】:
错过了。添加但仍然不允许我构建项目并将其发送到编辑屏幕。 哦,我错过了您在 EditItemView 中谈论的内容。我现在明白了。一旦我在 EditItemView 中设置了新的 @ObservedObject 并在 DetailView 中使用该名称来传递数据,它就工作得很好。非常感谢您的帮助!以上是关于SwiftUI 使用 CoreData 从列表中编辑项目的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI 移动列表单元格并在 CoreData 数据库中填充顺序
SwiftUI 如何使 CoreData 列表在 macOS 上可选择和可双击