簡體   English   中英

每次從 SwiftUI 中的詳細視圖返回時,如何阻止視圖刷新?

[英]How do I stop a view from refreshing each time I return from a detail view in SwiftUI?

我有一個顯示帖子列表的視圖。 我已經實現了無限滾動,並且它運行正常。 但是,我遇到了一個小問題,解決這個問題的嘗試讓我原地踏步。

主視圖

struct PostsHomeView: View {

    @EnvironmentObject var viewModel: ViewModel
    @State var dataInitiallyFetched = false

    var body: some View {
    
        NavigationView {
        
             VStack(alignment: .center, spacing: 0) {

                 if self.viewModel.posts.count > 0  {
                         
                     PostsListView(posts: self.viewModel.posts,
                                  isLoading: self.viewModel.canFetchMorePosts,
                                  onScrolledAtBottom: self.viewModel.fetchMorePosts
                     )

                 } else {

                     VStack {
                         
                         Text("You have no posts!")
                         
                     }
                 }
             }
             .onAppear() {

                 if !self.dataInitiallyFetched {

                     self.viewModel.fetchMostRecentPosts()

                     self.dataInitiallyFetched = true
                 }
             }
             .navigationBarTitle("Posts", displayMode: .inline)
       }
    }
}

列表顯示

struct PostsListView: View {
    
    @EnvironmentObject var viewModel: ViewModel      
    let posts: [Post]
    let isLoading: Bool
    let onScrolledAtBottom: () -> Void

    var body: some View {
       List {

           postsList
           
           if isLoading {
               loadingIndicator
           }
       }
    }
       
    private var postsList: some View {
               
       ForEach(posts, id: \.self) { post in

           PostsCellView(post: post)
               .onAppear {
                         
                   if self.posts.last == post {

                           self.onScrolledAtBottom()
                   }
               }
       }
       .id(UUID())
    } 
}

問題

點擊列表中的一個帖子后,我將進入詳細視圖。 當我點擊導航欄的后退按鈕以 go 回到帖子列表時,整個視圖被重新加載並且我的帖子獲取方法再次被觸發。

為了停止觸發獲取最新帖子的獲取方法,我添加了一個標志,我在初始加載后將其設置為 true。 當我在詳細信息視圖和帖子主屏幕之間來回 go 時,這會阻止獲取初始帖子集的 fetch 方法。

我嘗試了各種方法來阻止fetchMorePosts function 觸發,但我一直在兜圈子。 我在我的視圖 model 中的fetchMorePosts function 的頂部添加了一個 guard 語句。它檢查字符串是否等於“homeview”,如果不等於,則未完成提取。 每當訪問詳細視圖時,我都會將此字符串設置為“detailview”,然后在 guard 語句中將其重置回“homeview”。

guard self.lastView == "homeview" else {
    self.lastView = "homeview"
    return
}

這在一定程度上有效,但我一直在尋找它無法按預期工作的場景。 必須有一種直接的方式告訴 SwiftUI 不要重新加載視圖。 問題是該方法位於onAppear閉包中,這對於無限滾動的工作至關重要。 我還沒有使用 iOS 14,所以我不能使用@StateObject。

有沒有辦法告訴onAppear每次我從詳細視圖返回時不要觸發 onAppear?

提前致謝

罪魁禍首是.id(UUID()) 我將它從我的列表中刪除,一切又恢復正常了。

謝謝阿斯佩里。 非常感謝您的幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM