【发布时间】:2020-11-01 19:59:06
【问题描述】:
我试图检测用户何时滚动并且他到达底部附近,以便我可以加载下一批数据。我已经实现了scrollViewDidScroll(_ scrollView: UIScrollView),但没有任何反应。它触发的唯一一次是当我在底部后拉起屏幕时。所以我需要越过底部才能触发它。
我在这里做错了什么?
import SwiftUI
struct RequestsListView: View {
@ObservedObject var requestsViewModel: RequestsViewModel
var body: some View {
List {
ForEach(requestsViewModel.requests) { (request: Request) in
if let item = request.item {
RequestRowView(
requestViewModel: RequestViewModel(request: request),
itemViewModel: ItemViewModel(item: item)
)
.onAppear() {
if let index = requestsViewModel.requests.firstIndex(where: {$0.id == request.id}), index == 0 {
print("load more")
//requestsViewModel.load()
}
}
}
}
}
.onAppear() {
print("initialise")
if !requestsViewModel.loaded {
requestsViewModel.load()
}
}
}
}
class RequestsViewModel: ObservableObject {
@Published var requests = [Request]()
@Published var error = ""
@Published var loaded = false
var firestoreService: FirestoreService = FirestoreService()
var uid = Auth.auth().currentUser?.uid
var lastDocumentSnapshot: DocumentSnapshot?
var field: String
let limit = 6
init(field: String) {
self.field = field
}
func load() {
guard let uid = self.uid else { return }
var query: Query!
let itemsCollection: Query = Firestore.firestore().collection("requests").whereField(field, isEqualTo: uid)
//everytime you need more data fetched and on database updates to your snapshot this will be triggered
// ver order
if let nextStartingSnap = self.lastDocumentSnapshot {
query = itemsCollection.start(afterDocument: nextStartingSnap).limit(to: limit)
} else {
query = itemsCollection.limit(to: limit)
}
query.addSnapshotListener { (snapshot, error) in
self.loaded = true
guard let snapshot = snapshot else {
self.error = error!.localizedDescription
return
}
guard let lastSnapshot = snapshot.documents.last else {
// The collection is empty.
return
}
self.lastDocumentSnapshot = lastSnapshot
snapshot.documentChanges.forEach { (documentChange) in
if (documentChange.type == .added) {
var request = Request(document: documentChange.document)
self.firestoreService.fetchDocument(documentReference: request.itemReference) { (result: Result<Item, Error>) in
switch result {
case .success(let item):
request.item = item
self.requests.append(request)
case .failure(let error):
self.error = error.localizedDescription
}
}
}
}
}
}
}
【问题讨论】:
标签: ios swift uiscrollview swiftui swift5