SwiftUI ForEach 视图首次未更新

Anu*_*ugh 7 xcode ios swift 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()})
    }
Run Code Online (Sandbox Code Playgroud)

显然,PreviewDetailView(我在其中显示 API 响应数据)被触发,但视图没有更新。

E.C*_*oms 7

原因是当你使用stackForEachScrollView,你必须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()   
}
Run Code Online (Sandbox Code Playgroud)

  • 这个对我有用。我认为原因是在滚动视图中,如果没有初始视图,滚动视图不确定未来的尺寸。您可以在滚动视图内放置一些支架或加载指示器。当数据准备好时,它将更新视图。您是如何更新数据的?现在我确信这就是主要原因! (2认同)

Asp*_*eri 1

我可以猜测你posts最初是空的数组...这是一个(不知道功能或错误)带有空容器的独立 ForEach 初始化。顺便说一句,在这种情况下列出一切都可以。@State、 、 、@ObservedObjectonAppear和自定义出版商都不会影响或提供帮助。在 ForEach 中启动时只需清空容器。

解决方法:在容器中使用一些初始存根 Post,可以仅在视图构建器中进行有条件的检查,并且不会显示

或者使用List代替ScrollView/VStack/ForEach。

更新:我的错...当我写下这个最新短语时,我有一个想法,我总是以这样的组合使用它ScrollView/VStack/ForEach...简而言之,问题出在 ScrollView 中。