我正在尝试使用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响应数据)被触发,但视图未更新。任何线索将不胜感激!
答案 0 :(得分:2)
我认为,您必须检查“职位”对象是否为空;
if !self.posts.isEmpty {
ForEach(self.posts, id: \.id) { preview in
PreviewDetailView(preview: preview)
.background(Color(.red).cornerRadius(30))
}
}
答案 1 :(得分:1)
我可以猜到您的posts
最初是空数组...这是一个用空容器进行的ForEach初始化的(不知道功能或错误)。顺便说一句,在这种情况下,请列出一切正常。 @State
,@ObservedObject
,onAppear
和定制发布者都不会在这里产生影响或提供帮助。在ForEach中只是空容器。
解决方法:在容器中使用一些初始存根Post,可以在视图构建器中有条件地对其进行检查,而不会显示
或者使用List而不是ScrollView / VStack / ForEach。
更新:我的糟糕……当我写这句话时,我想到,我已经离开了ScrollView/VStack/ForEach
这样的组合,简而言之,问题出在ScrollView中。
答案 2 :(得分:1)
原因是当您在ScrollView中使用stack或ForEach时,必须设置setFrame限制来初始化视图设置,如下所示。
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()
}
答案 3 :(得分:0)
我的解决方案是像这样设置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
事先不知道要呈现的项目的尺寸,因此它会自行折叠。