You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI如何判断LazyVGrid滚动到底部实现分页加载数据?

SwiftUI 粉丝列表分页加载实现方案

你可以直接基于现有代码结构实现分页逻辑,无需复杂的ScrollViewReader、GeometryReader适配,具体修改如下:

步骤1:新增状态变量

在页面的@State定义区域新增2个状态变量,用于控制加载逻辑:

// 防止重复发起请求
@State private var isLoading = false
// 标记是否还有更多数据可加载
@State private var hasMoreData = true

步骤2:修改Cell的onAppear触发逻辑

将你FollowerCell的onAppear注释位置替换为以下判断:

.onAppear(perform: {
    // 当当前显示的Cell是列表最后一个、且未在加载、且还有更多数据时触发下一页请求
    if follower == followers.last, !isLoading, hasMoreData {
        page += 1
        getFollowers(userID: userID, page: page)
    }
})

步骤3:改造网络请求方法适配分页逻辑

修改getFollowers方法,处理加载状态和分页终止判断:

private func getFollowers(userID: String, page: Int) {
    isLoading = true
    NetworkManager.shared.getFollowers(for: userID, page: page) { result in
        // 请求结束无论成功失败都重置加载状态
        defer { isLoading = false }
        switch result {
        case .success(let followers):
            self.followers += followers
            // GitHub API单页最多返回100条,不足100说明已经到最后一页
            hasMoreData = followers.count == 100
            print("**** Count of Followers: \(self.followers.count)")
        case .failure(let error):
            print("getFollowers(gitHubUser:, page:) -> Error: \(error)")
        }
    }
}

可选优化:底部加载指示器

如果需要在列表底部显示加载状态,可以在LazyVGrid的ForEach块后添加以下代码:

if hasMoreData {
    ProgressView()
        .frame(height: 60)
        .onAppear {
            if !isLoading {
                page += 1
                getFollowers(userID: userID, page: page)
            }
        }
}

这种方式不需要判断当前Cell是否是最后一个,触发逻辑更直观。

内容的提问来源于stack exchange,提问作者JFortYork

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:09:02