如何绑定列表视图

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)
    

【讨论】:

以上是关于如何绑定列表视图的主要内容,如果未能解决你的问题,请参考以下文章

laravel5.2如何创建视图表

如何在相对布局中添加固定标题和滚动视图表行?

使用绑定时滚动 Xamarin Forms 列表视图

无法将查询另存为视图表

从视图表中获取数据时出现 Laravel 错误

文本文件字符串拆分然后将每个元素输出到视图表中