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)
}
}
}