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
相关产品推荐
相关产品推荐

