问题描述
我有一个显示帖子列表的视图。我已经实现了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。非常感谢您的帮助。