SwiftUI 在列表的单元格视图中更新观察对象

问题描述

我试图改变观察对象的值。该值将更改但不会永久更改。当我向下滚动并回滚时,该值将变回原始值。我猜是列表单元格视图中@State的问题。但我无法弄清楚在观察对象中永久更改数据的解决方案。那么我应该怎么做才能通过使用数据单元来永久更改数据。

struct ContentView: View {
    @Observedobject var dataClass = DataClass()
    var body: some View {
        List(dataClass.data){ item in
            DataCell(item: item)
        }
    }
}
struct DataCell: View {
    @State var item : DataModal
    var body: some View{
        HStack{
            Text("\(item.num!)")
            Text("\(item.val!)").onTapGesture {
                item.val = 1
            }

        }
        .padding(.vertical,100)
    }
}
struct DataModal : Identifiable {
    var id = UUID()
    var num : Int?
    var val : Int?
}
class DataClass : ObservableObject {
    @Published var data = [DataModal]()
    init(){
        load()
    }
    func load(){
        data = [DataModal(num: 1,val: 1),DataModal(num: 2,val: 2),DataModal(num: 3,val: 3),DataModal(num: 4,val: 4),DataModal(num: 5,val: 5),DataModal(num: 6,val: 6),DataModal(num: 7,val: 7),DataModal(num: 8,val: 8),DataModal(num: 9,val: 9),DataModal(num: 10,val: 10),DataModal(num: 11,val: 11),DataModal(num: 12,val: 12),DataModal(num: 13,val: 13)]
    }
}

解决方法

您传递了 DataModal 的副本,因为它是一种值类型。在这种情况下,您需要将绑定传递给 dataClass 内的原始值,例如

struct ContentView: View {
    @ObservedObject var dataClass = DataClass()
    var body: some View {
        List(dataClass.data.indices,id: \.self){ index in
            DataCell(item: $dataClass.data[index])
        }
    }
}

struct DataCell: View {
    @Binding var item : DataModal
    var body: some View{
        HStack{
            Text("\(item.num!)")
            Text("\(item.val!)").onTapGesture {
                item.val = 1
            }

        }
        .padding(.vertical,100)
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...