我正在按照不同的课程、教程等自己学习 SwiftUI。
到目前为止一切顺利,但我遇到了一个我找不到解决方案的问题,所以在调查了几个小时后,我决定寻求帮助。
目前,我正在尝试模拟一个社交媒体应用程序,人们可以在其中发布和关注等。我的大部分工作都在工作,但是当我尝试拉动刷新时问题就来了。
我有下一个代码;
GeometryReader{ reader -> AnyView in
DispatchQueue.main.async {
if refresh.startOffset == 0{
refresh.startOffset = reader.frame(in: .global).minY
}
refresh.offset = reader.frame(in: .global).minY
if refresh.offset - refresh.startOffset > 80 && !refresh.started{
refresh.started = true
}
//Check if refresh is started and drag is released
if refresh.startOffset == refresh.offset && refresh.started && !refresh.released{
withAnimation(Animation.linear){
refresh.released = true
}
updateData()
}
}
return AnyView(Color.black.frame(width: 0, height: 0))
}
.frame(width: 0, height: 0)
ZStack(alignment: Alignment(horizontal: .center, vertical: .top)){
if refresh.started && refresh.released{
ProgressView()
.progressViewStyle(CircularProgressViewStyle(tint: Color("samadhi_orange")))
.offset(y: 10)
.padding(.bottom)
}else{
Image(systemName: "arrow.down")
.font(.system(size: 16, weight: .heavy))
.foregroundColor(Color("samadhi_orange"))
.rotationEffect(.init(degrees: refresh.started ? 180 : 0))
.offset(y: -25)
.animation(.easeIn) //This is deprecated in my current IOS version but that should be ok
}
LazyVStack(){
ForEach(viewModel.posts(forFilter: mainSelectedFilter)){ post in
PostCell(viewModel: postCellViewModel(post: post))
.frame(height: 40)
}
}
}
而且我还有下一个功能。
func updateData(){
//Delaying for smooth animation
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
withAnimation(Animation.linear){
viewModel.fetchPosts()
refresh.released = false
refresh.started = false
}
}
}
我正在使用版本 13.0 beta 5 (13A5212g),开发目标是 IOS 15
上面的代码在更新数据时起作用(当下拉刷新时,它会调用我的 ViewModel 中名为 fetchPosts 的函数)
问题是,每次向下滚动一点几何阅读器时,它都会在我的“PostCell”中获取数据,帖子单元格对 firebase 有不同的调用(对于帖子内容和发布帖子的用户)
有谁知道代码有什么问题?欢迎任何提示。如果需要,我可以为我的“postcell”或其他任何东西提供代码。