[英]SwiftUI ForEach views not updating for the first time
我正在尝试使用 ForEach 填充一组视图。 我使用 Alamofire 获取数据并设置 @State 属性以触发更新。 不幸的是,更新仅在我切换屏幕(使用 TabBar)或转到主屏幕并重新打开应用程序时显示。
以下是我使用的代码片段:
@State var posts : [Post]
var body: some View {
ScrollView{
VStack(alignment: .leading, spacing: 0){
ForEach(posts, id: \.id) { preview in
PreviewDetailView(preview: preview).background(Color(.white).cornerRadius(30))
}
}
}.onAppear(perform: {fetchPosts()})
}
显然, PreviewDetailView
(我在其中显示 API 响应数据)被触发但视图没有更新。
原因是当您在ScrollView
中使用stack
或ForEach
时,您必须设置 Frame 限制来初始化视图设置,如下所示。
ScrollView{
VStack(alignment: .leading, spacing: 0){
ForEach(self.posts, id: \.id) { preview in
PreviewDetailView(preview: preview)
.background(Color(.red).cornerRadius(30))
}.frame(maxWidth: .infinity) // Here
}
}.onAppear{
self.fetchPosts()
}
我认为,您必须检查“帖子”对象是否为空;
if !self.posts.isEmpty {
ForEach(self.posts, id: \.id) { preview in
PreviewDetailView(preview: preview)
.background(Color(.red).cornerRadius(30))
}
}
我猜你的posts
最初是空数组......这是一个(不知道功能或错误)独立 ForEach 初始化与空容器。 顺便说一句,在这种情况下使用 List 一切正常。 @State
、 @ObservedObject
、 onAppear
和自定义发布者都不会影响或帮助这里。 在 ForEach 中启动时只是清空容器。
解决方法:在容器中使用一些初始存根 Post,它可以在视图构建器中有条件地检查而不显示
或者使用 List 而不是 ScrollView/VStack/ForEach。
更新:我的错......当我写这个最新的短语时,我有一个想法,我总是在这样的组合中使用它ScrollView/VStack/ForEach
......简而言之,问题出在 ScrollView 中。
我的解决方案是像这样为 VStack 设置一个 minHeight :
ScrollView{
VStack(alignment: .leading, spacing: 0){
ForEach(self.posts, id: \.id) { preview in
PreviewDetailView(preview: preview)
.background(Color(.red).cornerRadius(30))
}
}.frame(minHeight: <some_reasonable_Float_value, minWidth: <same_here>)
}
就像提到的一些海报一样, ScrollView
并不知道要呈现的项目的尺寸是多少,因此它会自行折叠。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.