微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

每当我从SwiftUI中的详细视图返回时,如何阻止视图刷新?

如何解决每当我从SwiftUI中的详细视图返回时,如何阻止视图刷新?

我有一个显示帖子列表的视图。我已经实现了infinite scrolling,并且运行正常。但是,我遇到了一个小问题,尝试解决这个问题使我转了一圈。

主视图

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())
    } 
}

问题

点击列表中的其中一个帖子后,便进入详细视图。当我点击导航栏的后退按钮以返回帖子列表时,整个视图将重新加载,并且我的帖子获取方法将再次被触发。

为了阻止从触发中获取最新帖子的获取方法,我添加一个在初始加载后设置为true的标志。当我在详细信息视图和帖子主屏幕之间来回切换时,这将阻止从最初的一组帖子中触发的获取方法

我尝试了各种方法来阻止fetchMorePosts函数的启动,但是我一直盘旋。我在视图模型的fetchMorePosts函数顶部添加了一条保护声明。它检查字符串是否等于“ homeview”,如果不相等,则提取未完成。每当访问详细信息视图时,我都将该字符串设置为“ detailview”,然后在保护声明中将其重置为“ homeview”。

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

这在一定程度上可行,但是我一直在寻找无法按预期工作的方案。必须有一种简单明了的方式告诉SwiftUI不要重新加载视图。问题在于方法位于onAppear闭包中,这对于无限滚动工作至关重要。我尚未使用iOS 14,因此无法使用@StateObject。

有没有办法告诉SwiftUI每次我从详细视图返回时都不触发onAppear

预先感谢

解决方法

罪魁祸首是truncate -s 0 /var/lib/docker/containers/*/*-json.log; 。我将其从列表中删除,然后一切又恢复了。

感谢Asperi。非常感谢您的帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。