Swiftui 为什么@Published更新文本但不更新列表?
我不明白为什么文本会更新,但列表没有更新 我有一个带有@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] = []
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)
}
}
}
}
}
嗯,因为我的错误我脸红了一点,但我很高兴我知道发生了什么。谢谢相信我,我做得更糟!哈哈哈,很高兴我能为你指出正确的方向。干杯@制作人威尔,因为我的错误,我有点脸红,但我很高兴我知道发生了什么。谢谢相信我,我做得更糟!哈哈哈,很高兴我能为你指出正确的方向。干杯@生产者感谢你。我很高兴我的问题是布局问题而不是逻辑问题。谢谢。我很高兴我的问题是布局问题而不是逻辑问题。