Swift中如何通过UIButton点击动作递增计数遍历数组与Firestore文档
实现方案
首先在你的视图控制器类中添加两个成员属性,用来缓存Firestore查询结果和记录当前遍历的下标:
// 缓存查询到的所有符合条件的文档 var mentorDocuments: [QueryDocumentSnapshot] = [] // 当前遍历到的下标 var currentIndex = 0
然后修改你的queryMethod方法,将查询到的文档存入缓存数组,你可以在viewDidLoad生命周期方法中调用该方法拉取一次数据即可,无需重复发起查询:
func queryMethod(){ let typeRef = Global.db.collection("userData") let query = typeRef.whereField("type", isEqualTo: "Mentor") query.getDocuments { [weak self] querySnapshot, err in guard let self = self else { return } if let err = err { print("Error getting documents: \(err)") } else if let documents = querySnapshot?.documents { // 把查询结果存入缓存数组 self.mentorDocuments = documents // 可选:初始化后默认加载第一个文档 self.currentIndex = 0 if let firstDoc = documents.first { print("\(firstDoc.documentID) => \(firstDoc.data())") // 这里写你需要的第一个文档的处理逻辑 } } } }
最后实现按钮绑定的IBAction方法,每次点击时递增下标、取出对应文档处理:
@IBAction func nextButtonTapped(_ sender: UIButton) { // 避免下标越界 guard currentIndex < mentorDocuments.count - 1 else { // 已经遍历到最后一个文档,你可以在这里做提示,或者重置下标实现循环遍历 print("已经到最后一份文档了") // 如果需要循环遍历,打开下面这行注释即可 // currentIndex = 0 return } // 下标+1 currentIndex += 1 // 取出当前对应文档 let currentDoc = mentorDocuments[currentIndex] print("\(currentDoc.documentID) => \(currentDoc.data())") // 这里写你需要的文档处理逻辑 }
注意事项
- 避免每次点击按钮都发起Firestore查询,重复查询会消耗请求配额还会导致响应卡顿,仅在页面初始化、或者需要刷新数据时调用
queryMethod即可 - 所有可选值都做了安全判断,不要使用
!强行解包,避免空值崩溃 - 如果需要支持向前遍历,再加一个按钮,点击时判断
currentIndex > 0之后将下标减1即可
内容的提问来源于stack exchange,提问作者Bina
相关产品推荐
相关产品推荐

