【发布时间】: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