SwiftUI ForEach视图第一次没有更新

时间:2019-11-26 16:22:38

标签: ios swift xcode swiftui

我正在尝试使用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响应数据)被触发,但视图未更新。任何线索将不胜感激!

4 个答案:

答案 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@ObservedObjectonAppear和定制发布者都不会在这里产生影响或提供帮助。在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事先不知道要呈现的项目的尺寸,因此它会自行折叠。