如何绑定列表视图
Posted
技术标签:
【中文标题】如何绑定列表视图【英文标题】:How do you bind a list view 【发布时间】:2021-01-20 20:41:33 【问题描述】:我有一个 CoordinateList 视图,它显示了已输入的 CoordinateRow 视图的列表,并且可以就地编辑(在列表视图中)。要将新点添加到列表中,用户按下列表底部的按钮,它会添加一行(无需转到另一个屏幕)。如何让它更新视图以显示这个新条目?我尝试用一个函数包装坐标列表的 append 函数,以便在添加到列表时可以调用 objectWillChange.send(),但它似乎没有做任何事情。
我想我没有足够的声望来上传图片,但这里有一张图片:
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()
【问题讨论】:
【参考方案1】:您需要识别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)
【讨论】:
以上是关于如何绑定列表视图的主要内容,如果未能解决你的问题,请参考以下文章