我的应用程序有一个ScrollView内部LazyVStack。
内部采用DailyEventsForEach数组:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
因此,每次我在数组中添加新的DailyEventsLazyVStack时,都会正确更新。
但是,如果我在已经存在的DailyEvents的 events 属性中添加新的EventInfo。看不到更新,也不会重新加载。LazyVstack
如果我切换LazyVstack为 a VStack,一切正常。
用户界面:
@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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
在 SWIFTUI 中,除了 UIKit UITableView 的 reloadData() 方法之外,没有其他方法可以重新加载列表/LazyStack 数据。
我遇到了完全相同的问题,即数据源更新时 List 或 LazyVStack UI 未更新。[这里数据源应该是 @ObservedObject/@State]
我使用了一个简单的技巧来解决这个问题——为视图分配一个唯一的 ID,如下所示。
List(items, id: \.self) {
Text($0.name)
}
.id(UUID())
Run Code Online (Sandbox Code Playgroud)
LazyVStack 的示例:
LazyVStack {
ForEach(items, id: \.self) { item in
Text(item.name)
}
}
.id(UUID())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1690 次 |
| 最近记录: |