你如何绑定列表视图

问题描述

我有一个 CoordinateList 视图,它显示了已输入的 CoordinateRow 视图列表,并且可以就地编辑(在列表视图中)。要将新点添加到列表中,用户按下列表底部的按钮,并添加一行(无需转到另一个屏幕)。如何让它更新视图以显示这个新条目?我尝试用一​​个函数包装坐标列表的 append 函数,以便在添加到列表时可以调用 objectwillChange.send(),但它似乎没有做任何事情。

我想我没有足够的声誉来上传图片,但这是一张图片

demo

import SwiftUI

class LocationTime : ObservableObject {
    @Published var lat: String = "0.0"
    @Published var lon: String = "0.0"
    @Published var timestamp: String =  "SomeDateTime"
}

class ModelData: ObservableObject {
    @Published var positionCoords = [LocationTime]()
    func appendPosition(_ loc: LocationTime) {
        objectwillChange.send()
        positionCoords.append(loc)
    }
}

struct CoordinateRow: View {
    @EnvironmentObject var modelData: ModelData
    var pointIndex : Int
    var body: some View {
        HStack {
            Text("Lon: ")
            TextField("40",text:$modelData.positionCoords[pointIndex].lon)
            Text("Lat: ")
            TextField("",text:$modelData.positionCoords[pointIndex].lat)
            Text("Time: ")
            TextField("time",text:$modelData.positionCoords[pointIndex].timestamp)
        }.padding()
        .overlay(RoundedRectangle(cornerRadius:16)
                    .stroke(Color.blue,linewidth:4.0))
    }
}

struct CoordinateList: View {
    @EnvironmentObject var modelData : ModelData
    
    var body: some View {
        vstack{
            Text("Location Log")
                .font(.largeTitle).padding()
            List{
            ForEach(modelData.positionCoords.indices){
                CoordinateRow(pointIndex: $0).environmentObject(modelData)
            }
            }
            Button(action:{
                modelData.appendPosition(LocationTime())
                print(modelData.positionCoords.count)
            }){
                Image(systemName: "plus.circle")
                    .imageScale(.large)
                    .scaleEffect(2.0)
                    .padding()
            }
            
            
            Spacer()
        }
        
    }
}

解决方法

您需要在 ForEach 中识别记录

ForEach(modelData.positionCoords.indices,id: \.self){     // << here !!
    CoordinateRow(pointIndex: $0).environmentObject(modelData)
}

顺便说一下,删除 objectWillChange.send()

    func appendPosition(_ loc: LocationTime) {
//        objectWillChange.send()      // << called automatically for @Published
        positionCoords.append(loc)
    }

相关问答

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