1

我不明白为什么Text更新,但List没有。

我有一个模型,@Published它是一个日期数组。还有一种从日期生成文本的方法。

这是一个简化版本:

class DataModel: NSObject, ObservableObject {
    
    @Published var selectedDates: [Date] = []

    func summary() -> String {
        var lines: [String] = []
        for date in selectedDates.sorted().reversed() {
            let l = "\(someOtherStuff) \(date.dateFormatted)"
            lines.append(l)
        }
        return lines.joined(separator: "\n")
    }

}

我在我的观点中展示了这段文字。这是一个简化版本:

struct DataView: View {

    @ObservedObject var model: DataModel

    var body: some View {
        ScrollView {
            Text(model.summary())
        }
    }

}

它有效:当用户从视图中的 UI 向 中添加日期时model.selectedDates,摘要文本会正确更新。


现在我想用行列表替换文本。

我改变方法:

    func summary() -> [String] {
        var lines: [String] = []
        for date in selectedDates.sorted().reversed() {
            let l = "\(someOtherStuff) \(date.dateFormatted)"
            lines.append(l)
        }
        return lines
    }

并改变观点:

    var body: some View {
        ScrollView {
            List {
                ForEach(model.summary(), id: \.self) { line in
                    Text(line)
                }
            }
        }
    }

但这不起作用:列表中根本没有文本,当用户将日期添加到model.selectedDates.

我究竟做错了什么?

4

3 回答 3

2

我能够在 SO 上的上一篇文章中找到这个答案,这可能是您问题的解决方案。当您说列表中根本没有文本时,您是否进行了调试以验证这一点,或者屏幕上根本没有显示数据?

当我复制您的代码片段并对其进行修改时,似乎列表中实际上存在列表试图在屏幕上显示的数据,但是列表的框架被滚动视图覆盖。将所有内容嵌套在 GeometryReader 中并为 List 提供帧大小,为程序提供了听起来像您正在寻找的功能。

于 2020-12-15T01:34:26.820 回答
1

为您的数据使用 ScrollView 或 List。如果一个 List 有多个值,它会自动变成一个可滚动的 List。所以,我相信你可以完全删除 ScrollView。

于 2020-12-15T03:22:08.073 回答
1

这是一个固定的工作变体(有一些复制 - 因此您需要将其调整回您的项目)。

使用 Xcode 12.1 / iOS 14.1 测试

class DataModel: NSObject, ObservableObject {
    
    @Published var selectedDates: [Date] = []
    
    func summary() -> [String] {
        var lines: [String] = []
        for date in selectedDates.sorted().reversed() {
            let l = "someOtherStuff \(date)"
            lines.append(l)
        }
        return lines
    }
    
}

struct DataView: View {
    
    @ObservedObject var model: DateDataModel = DataModel()
    
    var body: some View {
        VStack {
            Button("Add") { model.selectedDates.append(Date())}
            List {
                ForEach(model.summary(), id: \.self) { line in
                    Text(line)
                }
            }
        }
    }
    
}
于 2020-12-15T03:53:07.693 回答