我是我的应用程序,我有一个ScrollView,里面有一个LazyVStack。
内部的ForEach接受一个DailyEvents数组
struct DailyEvents: Equatable, Identifiable {
var id: String {
dayString + "\(events.count)"
}
let day: Date
let events: [EventInfo]
var isToday: Bool {
day.isToday()
}
var dateString: String {
DateFormatter.dayMonthDateFormtter.string(from: day)
}
var dayString: String {
isToday ? "today".localized : DateFormatter.dayDateFormtter.string(from: day)
}
}因此,每次我在数组中添加一个新的DailyEvents时,LazyVStack都会正确地更新。
但是,如果我在一个已经存在的EventInfo的events属性中添加一个新的DailyEvents。LazyVstack没有看到更新,也没有重新加载。
如果我将LazyVstack转换为VStack,一切都会正常工作。
UI:
@ObservedObject var viewModel: ViewModel
var scrollViewProxy = ScrollViewProxyManager()
@SwiftUI.State private var isBackToTodayVisible = false
private var events: [DailyEvents] {
viewModel.dailyEvents.value ?? []
}
var eventsList: some View {
ZStack(alignment: .bottom) {
ScrollView {
ScrollViewReader { proxy in
LazyVStack(alignment: .center, spacing: 0) {
Spacer()
.frame(height: 16)
ForEach(events, id: \.id) { dailyEvent in
makeDailyEvents(dailyEvent)
}
}
.onAppear {
scrollViewProxy.setProxy(proxy: proxy)
}
}
}
if isBackToTodayVisible {
scrollTodayButton
.padding(.bottom, 16)
}
}
}发布于 2022-08-19 07:14:54
在SWIFTUI中,除了UIKit UITableView的reloadData()方法之外,别无选择,可以重新加载list/LazyStack数据。
我所面临的问题完全相同,当数据源LazyVStack数据源应该是@观测者对象/@状态时,列表或updates.here UI没有更新。
我使用了一个简单的技巧来解决这个问题--给视图分配一个唯一的ID,如下所示。
List(items, id: \.self) {
Text($0.name)
}
.id(UUID())使用LazyVStack的示例:
LazyVStack {
ForEach(items, id: \.self) { item in
Text(item.name)
}
}
.id(UUID())https://stackoverflow.com/questions/67836347
复制相似问题