如何绑定在核心数据数组中编辑变量的文本字段列表



Swift ui需要一个Binding<String>来链接到文本字段中正在更新的值。就像原生的iPhone提醒应用程序一样,我希望允许在线编辑一个持久的列表。

附加的代码只起作用,但由于每个项都绑定到同一个变量,因此为它们提供了相同的名称。如何将其绑定到[FruitEntity]数组?

class CoreDataViewModel: ObservableObject {

//static let instance = CoreDataViewModel()
let container: NSPersistentContainer
let context: NSManagedObjectContext
@Published var savedEntities: [FruitEntity] = []
}

struct Screen: View {

@StateObject var vm = CoreDataViewModel()

var body: some View {
List{
ForEach(vm.savedEntities, id: .self) {entity in
VStack{
HStack {
TextField("(entity.name ?? "Workout Name...")", text: $questionVariable)
.onChange(of: entity.name) { text in
entity.name = questionVariable
}
}
.onDelete(perform: vm.deleteFruit)
.onMove(perform: moveItem)
}
}
}
}
}

您只需将TextField移动到一个单独的视图中,其中字段有自己的@State变量,实体有另一个变量。

创建如下视图:

struct ChangeName: View {
// Will change the entity
let entity: FruitEntity
// Will update the field
@State private var questionVariable = ""
var body: some View {
TextField("(entity.name ?? "Workout Name...")", text: $questionVariable)
.onChange(of: questionVariable) { text in
entity.name = text
// Remember to save the persistent container/ managed-object-context
}
}
}

在你的主视图中称之为:

struct Screen: View {
List{
ForEach(vm.savedEntities, id: .self) {entity in
VStack{
HStack {
ChangeName(entity: entity)
}
}
.onDelete(perform: vm.deleteFruit)
.onMove(perform: moveItem)
}
}
}

最新更新