繁体   English   中英

SwiftUI ForEach 视图不是第一次更新

[英]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中使用stackForEach时,您必须设置 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@ObservedObjectonAppear和自定义发布者都不会影响或帮助这里。 在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM