簡體   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