如何更改来自结构的项目的 bool 值并因此更新清单?
How do I change the bool value of an item that comes from a struct and hence update a checklist?
背景
我正在尝试构建一个列表,旁边有一个 checkmark/tick 框。结构用于为每个项目创建 "data"。然后将其传递给 class ,其中包含由该结构创建的项目数组。从这里开始,我使用了可观察对象协议并将 class 传递到列表中。
Objective
我希望能够在完成时将每个项目单独标记为已完成。
当前分析
我知道当我手动将 'completed' 值从 false 更改为 true 时图像会切换。
我还测试了 onTapAction 以确保它正常工作。
我认为问题出在 "self.one.completed.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)}
P.S。我对 Swift 和 Stack overflow 比较陌生,所以任何其他建议都将不胜感激
在我的 other answer 中,我使用 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())
}
}
背景
我正在尝试构建一个列表,旁边有一个 checkmark/tick 框。结构用于为每个项目创建 "data"。然后将其传递给 class ,其中包含由该结构创建的项目数组。从这里开始,我使用了可观察对象协议并将 class 传递到列表中。
Objective
我希望能够在完成时将每个项目单独标记为已完成。
当前分析
我知道当我手动将 'completed' 值从 false 更改为 true 时图像会切换。
我还测试了 onTapAction 以确保它正常工作。
我认为问题出在 "self.one.completed.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)}
P.S。我对 Swift 和 Stack overflow 比较陌生,所以任何其他建议都将不胜感激
在我的 other answer 中,我使用 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())
}
}