Swiftui 为什么@Published更新文本但不更新列表?

Swiftui 为什么@Published更新文本但不更新列表?,swiftui,swiftui-list,observableobject,observedobject,swiftui-foreach,Swiftui,Swiftui List,Observableobject,Observedobject,Swiftui Foreach,我不明白为什么文本会更新,但列表没有更新 我有一个带有@Published的模型,它是一个日期数组。 还有一种方法可以根据日期生成文本 以下是一个简化版本: class DataModel: NSObject, ObservableObject { @Published var selectedDates: [Date] = [] func summary() -> String { var lines: [String] = []

我不明白为什么文本会更新,但列表没有更新

我有一个带有@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())
        }
    }

}
我在我的视图中显示这个文本。以下是一个简化版本:

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添加日期时,它永远不会更新

我做错了什么?

我找到了上一篇文章,这可能是解决您问题的方法。当您说列表中根本没有文本时,您是调试以验证这一点,还是根本没有数据显示在屏幕上

当我复制您的代码片段并摆弄它时,似乎列表中确实有数据试图显示在屏幕上,但列表的框架被Scrollview覆盖。将所有内容嵌套在GeometryReader中,并为列表提供一个帧大小,这使程序具有了您想要的功能。

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


当我复制您的代码片段并摆弄它时,似乎列表中确实有数据试图显示在屏幕上,但列表的框架被Scrollview覆盖。将所有内容嵌套在GeometryReader中,并为列表指定一个帧大小,使程序具有您想要的功能。

使用滚动视图或列表查看数据。如果一个列表有多个值,它会自动变成一个可滚动的列表。因此,我相信您可以完全删除ScrollView。

使用ScrollView或列表保存数据。如果一个列表有多个值,它会自动变成一个可滚动的列表。因此,我相信您可以完全删除ScrollView。

这里有一个固定的工作变体,带有一些复制-因此您需要将其重新调整到您的项目中

使用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)
                }
            }
        }
    }
    
}

这是一个带有一些复制的固定工作变体-因此您需要将其重新调整到您的项目中

使用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)
                }
            }
        }
    }
    
}

嗯,因为我的错误我脸红了一点,但我很高兴我知道发生了什么。谢谢相信我,我做得更糟!哈哈哈,很高兴我能为你指出正确的方向。干杯@制作人威尔,因为我的错误,我有点脸红,但我很高兴我知道发生了什么。谢谢相信我,我做得更糟!哈哈哈,很高兴我能为你指出正确的方向。干杯@生产者感谢你。我很高兴我的问题是布局问题而不是逻辑问题。谢谢。我很高兴我的问题是布局问题而不是逻辑问题。