首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI: LazyVStack不更新

SwiftUI: LazyVStack不更新
EN

Stack Overflow用户
提问于 2021-06-04 11:21:11
回答 1查看 469关注 0票数 1

我是我的应用程序,我有一个ScrollView,里面有一个LazyVStack

内部的ForEach接受一个DailyEvents数组

代码语言:javascript
复制
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属性中添加一个新的DailyEventsLazyVstack没有看到更新,也没有重新加载。

如果我将LazyVstack转换为VStack,一切都会正常工作。

UI:

代码语言:javascript
复制
@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)
                }
            }
        }
EN

回答 1

Stack Overflow用户

发布于 2022-08-19 07:14:54

在SWIFTUI中,除了UIKit UITableView的reloadData()方法之外,别无选择,可以重新加载list/LazyStack数据。

我所面临的问题完全相同,当数据源LazyVStack数据源应该是@观测者对象/@状态时,列表或updates.here UI没有更新。

我使用了一个简单的技巧来解决这个问题--给视图分配一个唯一的ID,如下所示。

代码语言:javascript
复制
List(items, id: \.self) {
   Text($0.name)
}
.id(UUID())

使用LazyVStack的示例:

代码语言:javascript
复制
LazyVStack {
  ForEach(items, id: \.self) { item in
    Text(item.name)
  }
}
.id(UUID())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67836347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档