swift 快速到达滚动视图底部不正确

vfh0ocws  于 2023-02-21  发布在  Swift
关注(0)|答案(1)|浏览(125)

你好,我有一个滚动视图,我想知道当用户滑动到它的底部,这样我就可以填充更多的数据到它。我下面的代码是不是工作得很好。当sim启动“你好”打印约5倍,当我几乎没有移动它“你好”打印像10倍以上,当我到达滚动视图的底部,“你好”被打印了大概100次。我怎么才能修复我的代码,使你好只在到达底部时打印。

import SwiftUI
import UIKit

struct FeedView: View {    
    @State private var scrollViewHeight = CGFloat.infinity
    @Namespace private var scrollViewNameSpace
    
    var body: some View {
        mainInterFaceView
    }
}

extension FeedView{
    var mainInterFaceView: some View{
            ZStack(){
                ScrollView {
                    LazyVStack {
                        ForEach(viewModel.tweets) { tweet in
                            Button {

                            } label: {
                                someView()
                                    .background(
                                        GeometryReader { proxy in
                                            Color.clear
                                                .onChange(of: proxy.frame(in: .named(scrollViewNameSpace))) { newFrame in
                                                    if newFrame.minY < scrollViewHeight {
                                                        print("called")
                                                    }
                                                }
                                            
                                        }
                                    )
                                
                            }
                        }
                    }
                }
                .background(
                    GeometryReader { proxy in
                        Color.clear
                            .onChange(of: proxy.size, perform: { newSize in
                                let _ = print("ScrollView: ", newSize)
                                scrollViewHeight = newSize.height
                            })
                    }
                )
                .coordinateSpace(name: scrollViewNameSpace)
                
            }
        }
}
x4shl7ld

x4shl7ld1#

有一种比使用GeometryReader更简单的方法,可以尝试计算偏移量。
如果有更多页的数据可用,您只需要在VStack的底部显示一个视图(ProgressView工作得很好),然后在它出现时加载更多数据(使用.task修饰符)

struct Tweet: Identifiable {
    let id = UUID()
    let text: String
}

@MainActor
final class TweetModel: ObservableObject {
    
    private let pageSize = 20
    private (set) var tweets: [Tweet] = []
    private (set) var moreTweetsAvailable = false
    private var nextPage = 0
    
    func loadFirstPage() async  {
        nextPage = 0
        await loadPage()
    }
    
    func loadNextPage() async  {
        await loadPage()
    }
    
    private func loadPage() async {
        let tweets = await // load tweets for nextPage
        moreTweetsAvailable = tweets.count == pageSize
        self.tweets.append(contentsOf: tweets)
        nextPage += 1
    }

struct ContentView: View {
    
    @StateObject var tweetModel = TweetModel()
    
    var body: some View {
        ScrollView {
            LazyVStack {
                ForEach(tweetModel.tweets) { tweet in
                    Text(tweet.text)
                }
                if tweetModel.moreTweetsAvailable {
                    ProgressView()
                        .task {
                            await tweetModel.loadNextPage()
                        }
                }
            }
        }
        .task {
            await tweetModel.loadFirstPage()
        }
    }
}

相关问题