【发布时间】:2021-10-07 01:00:53
【问题描述】:
我对 SwiftUI 还很陌生,我正在尝试找出一个我似乎无法解决的问题。我正在构建一个基于 GitHub API 的应用程序。在其中一个屏幕中,我显示了特定用户拥有的所有关注者。
我想要完成的是,我想知道用户何时滚动到关注者列表的底部,因为我目前只从服务器获取 100 条记录。
我如何知道用户何时滚动到这 100 个关注者的底部,以便我可以在第二页和后续页面中发起另外 100 条记录的请求?
我在 google 上搜索过,看到了有关 ScrollViewReader、GeometryReader 的信息,但我不知道如何解决这个问题。这是此特定屏幕中的代码:
import SwiftUI
struct FollowersScreen: View {
@EnvironmentObject var savedFavorites: SavedFavorites
@State var userID: String
@State private var isPresented = false
@State private var followers: [Follower] = []
@State private var page = 1
@State private var user: User? = nil
let columns = [GridItem(.flexible()), GridItem(.flexible()), GridItem(.flexible())]
var body: some View {
VStack {
ScrollView {
LazyVGrid(columns: columns, content: {
ForEach(followers, id: \.self) { follower in
FollowerCell(follower: follower)
.onAppear(perform: {
// What do I do here to get 100 more records properly?
})
.onTapGesture {
self.getFollowerDetails(userID: follower.login)
}// ON TAP GESTURE
}// FOR EACH
})// LAZYVGRID
.padding(.horizontal)
}// SCROLL VIEW
}// VSTACK
.onAppear(perform: {
self.getFollowers(userID: userID, page: 1)
})
.navigationTitle("\(userID) Followers")
.navigationBarTitleDisplayMode(.inline)
.navigationBarItems(trailing:
Button(action: {
addFavourite(gitHubUser: userID)
}) {
Image(systemName: Images.heartCircle)
.resizable()
.scaledToFit()
.frame(width: 33, height: 33, alignment: .center)
}
)// NAV BAR ITEMS
.sheet(isPresented: $isPresented, onDismiss: nil) {
FollowersDetailScreen(gitHubUser: $userID, isPresented: $isPresented, followers: $followers, user: user)
}
.environmentObject(savedFavorites)
}// BODY
private func getFollowers(userID: String, page: Int) {
NetworkManager.shared.getFollowers(for: userID, page: page) { result in
switch result {
case .success(let followers):
self.followers += followers
print("**** Count of Followers: \(self.followers.count)")
case .failure(let error):
print("getFollowers(gitHubUser:, page:) -> Error: \(error)")
}
}
}
private func getFollowerDetails(userID: String) {
NetworkManager.shared.getUserInfo(for: userID) { result in
switch result {
case .success(let user):
print("Success, found the user info!")
self.user = user
guard let tempUser = self.user else { return }
print(tempUser)
self.isPresented = true
case .failure(let error):
print("getUser(gitHubUser:, page:) -> Error: \(error)")
}
}
}
private func addFavourite(gitHubUser: String) {
NetworkManager.shared.getUserInfo(for: gitHubUser) { result in
switch result {
case .success(let user):
let favorite = Follower(login: user.login, avatarUrl: user.avatarUrl)
savedFavorites.favorites.append(favorite)
PersistenceManager.shared.encodeJSONToDisk(favorites: savedFavorites.favorites)
case .failure(let error):
print("getFavourite(gitHubUser:, page:) -> Error: \(error)")
}
}
}
}
struct FollowersScreen_Previews: PreviewProvider {
static var previews: some View {
FollowersScreen(userID: "sallen0400")
}
}
【问题讨论】:
-
要回答您的问题,您需要处理
GeometryReader,当我们处于所有关注者的底部时,它需要一些行代码来通知,但这是不必要的,因为LazyVGrid足够聪明调用所需的数据!你不应该关心它!如果没有 LazyVGrid 存在,你会做这样的事情! -
抱歉,您的评论完全不清楚。
-
你的意思是完全不清楚?
-
是的,如果您能描述更容易理解的步骤。
标签: swiftui