如何更改来自结构体的项目的布尔值,从而更新清单?



Background
我正在尝试构建一个列表,旁边有一个复选标记/复选框。结构用于为每个项目创建"数据"。然后将其传递给一个类,该类保存由结构创建的项数组。从这里开始,我使用了可观察的对象协议并将类传递到一个列表中。

目标
我希望能够在完成后单独将每个项目标记为已完成。

当前分析
我知道当我手动将"已完成"值从 false 更改为 true 时图像会切换。 我还测试了onTapAction,以确保它正常工作。 我认为问题在于"self.one.complete.toggle(("或绑定或我不知道的东西。

struct One: Identifiable, Codable {
let id = UUID()
var item: String
var completed:Bool = false
}
class OneList: ObservableObject{
@Published var items1 = [One]()


struct ContentView: View {
@ObservedObject var itemss1 = OneList()
@ObservedObject var itemss2 = TwoList()
@ObservedObject var itemss3 = ThreeList()
@ObservedObject var itemss4 = FourList()
@State private var  showingAdditem: Bool = false
@Binding var one:One
var body: some View {
NavigationView{
ZStack{
List{
Section(header: Text("Vital")){
ForEach(itemss1.items1){ item in
HStack{
Image(systemName: self.one.completed ? "checkmark.circle":"circle")
.onTapGesture {
self.one.completed.toggle()
}
Text(item.item)}

附言我对 Swift 和 Stack 溢出相对较新,因此任何其他建议将不胜感激

在我的另一个答案中,我用ObservableObject协议为所需对象实现了这样的事情,然后玩EnvironmentObject.实际上,我没有尝试使用其他包装器执行此操作。这是代码,您可以在其中看到切换图像:

import SwiftUI
class One: Identifiable, ObservableObject { // ObservableObject requires class
let id: UUID
var item: String = "[undefined]"
@Published var completed: Bool = false // this will affect the UI
init(item: String, completed: Bool) {
id = UUID()
self.item = item
self.completed = completed
}
}
class OneList: ObservableObject{
@Published var items = [One(item: "first", completed: false),
One(item: "second", completed: false),
One(item: "third", completed: false)]
}
struct CheckboxList: View {
@EnvironmentObject var itemList: OneList
var body: some View {
List {
Section(header: Text("Vital")) {
ForEach(itemList.items.indices) { index in
VitalRow()
.environmentObject(self.itemList.items[index])
.onTapGesture {
self.itemList.items[index].completed.toggle()
}
}
}
}
}
}
struct VitalRow: View {
@EnvironmentObject var item: One
var body: some View {
HStack{
Image(systemName: item.completed ? "checkmark.circle" : "circle")
Text("(item.item)")
}
}
}
struct CheckboxList_Previews: PreviewProvider {
static var previews: some View {
CheckboxList().environmentObject(OneList())
}
}

最新更新